This issue tracker has been migrated to GitHub, and is currently read-only.
For more information, see the GitHub FAQs in the Python's Developer Guide.

Author eryksun
Recipients Andreas.Gäer, Patrick.von.Reth, brian.curtin, eryksun, lars.gustaebel
Date 2014-05-06.23:52:17
SpamBayes Score -1.0
Marked as misclassified Yes
Message-id <1399420338.75.0.937885849681.issue13702@psf.upfronthosting.co.za>
In-reply-to
Content
This should be fixed in os.symlink. The Windows CreateSymbolicLink function can't be relied on to translate slash to backslash. It only normalizes an absolute link, or a path that's relative to the current working directory on a drive (e.g. "R:../crypto") since that's stored as an absolute link. 

For example:

    >>> os.symlink('C:/Program Files/Python34', 'Python34')
    >>> os.system('fsutil reparsepoint query Python34')
    Reparse Tag Value : 0xa000000c
    Tag value: Microsoft
    Tag value: Name Surrogate
    Tag value: Symbolic Link

    Reparse Data Length: 0x00000078
    Reparse Data:
    0000:  32 00 3a 00 00 00 32 00  00 00 00 00 43 00 3a 00  2.:...2.....C.:.
    0010:  2f 00 50 00 72 00 6f 00  67 00 72 00 61 00 6d 00  /.P.r.o.g.r.a.m.
    0020:  20 00 46 00 69 00 6c 00  65 00 73 00 2f 00 50 00   .F.i.l.e.s./.P.
    0030:  79 00 74 00 68 00 6f 00  6e 00 33 00 34 00 5c 00  y.t.h.o.n.3.4.\.
    0040:  3f 00 3f 00 5c 00 43 00  3a 00 5c 00 50 00 72 00  ?.?.\.C.:.\.P.r.
    0050:  6f 00 67 00 72 00 61 00  6d 00 20 00 46 00 69 00  o.g.r.a.m. .F.i.
    0060:  6c 00 65 00 73 00 5c 00  50 00 79 00 74 00 68 00  l.e.s.\.P.y.t.h.
    0070:  6f 00 6e 00 33 00 34 00                           o.n.3.4.

The print name uses forward slash, but the NT substitute name uses backslash. In this case, GetFinalPathNameByHandle works fine ("\??" is the NT DosDevices directory in which "C:" is a symbolic link to something like "\Device\HarddiskVolume1"):

    >>> print(os.path._getfinalpathname('Python34'))
    \\?\C:\Program Files\Python34

OTOH, forward slashes aren't translated in a relative link:

    >>> os.remove('Python34')
    >>> os.symlink('/Program Files/Python34', 'Python34')  
    >>> os.system('fsutil reparsepoint query Python34')
    Reparse Tag Value : 0xa000000c
    Tag value: Microsoft
    Tag value: Name Surrogate
    Tag value: Symbolic Link

    Reparse Data Length: 0x00000068
    Reparse Data:
    0000:  2e 00 2e 00 00 00 2e 00  01 00 00 00 2f 00 50 00  ............/.P.
    0010:  72 00 6f 00 67 00 72 00  61 00 6d 00 20 00 46 00  r.o.g.r.a.m. .F.
    0020:  69 00 6c 00 65 00 73 00  2f 00 50 00 79 00 74 00  i.l.e.s./.P.y.t.
    0030:  68 00 6f 00 6e 00 33 00  34 00 2f 00 50 00 72 00  h.o.n.3.4./.P.r.
    0040:  6f 00 67 00 72 00 61 00  6d 00 20 00 46 00 69 00  o.g.r.a.m. .F.i.
    0050:  6c 00 65 00 73 00 2f 00  50 00 79 00 74 00 68 00  l.e.s./.P.y.t.h.
    0060:  6f 00 6e 00 33 00 34 00                           o.n.3.4.

In this case GetFinalPathNameByHandle fails because the NT executive doesn't interpret forward slash as a path delimiter:

    >>> os.path._getfinalpathname('Python34')
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    OSError: [WinError 123] The filename, directory name, or volume label 
    syntax is incorrect: 'Python34'

I think this is a bug in CreateSymbolicLink, but os.symlink should work around it by first normalizing the target path to use os.sep.
History
Date User Action Args
2014-05-06 23:52:18eryksunsetrecipients: + eryksun, lars.gustaebel, brian.curtin, Patrick.von.Reth, Andreas.Gäer
2014-05-06 23:52:18eryksunsetmessageid: <1399420338.75.0.937885849681.issue13702@psf.upfronthosting.co.za>
2014-05-06 23:52:18eryksunlinkissue13702 messages
2014-05-06 23:52:17eryksuncreate