]> granicus.if.org Git - php/commitdiff
- fix #48746, regression with file operaiton on path with junctions
authorPierre Joye <pajoye@php.net>
Wed, 26 Aug 2009 20:44:05 +0000 (20:44 +0000)
committerPierre Joye <pajoye@php.net>
Wed, 26 Aug 2009 20:44:05 +0000 (20:44 +0000)
TSRM/tsrm_virtual_cwd.c

index 45d5cdf8a83f1ebb0988749a7baab99435486a53..bb1e3299547be91a859abc5f38f5bc37ca980cc9 100644 (file)
@@ -692,12 +692,22 @@ static int tsrm_realpath_r(char *path, int start, int len, int *ll, time_t *t, i
                        if(pbuffer->ReparseTag == IO_REPARSE_TAG_SYMLINK) {
                                rname_len = pbuffer->SymbolicLinkReparseBuffer.PrintNameLength/2;
                                rname_off = pbuffer->SymbolicLinkReparseBuffer.PrintNameOffset/2;
+                               if(rname_len <= 0) {
+                                       rname_len = pbuffer->SymbolicLinkReparseBuffer.SubstituteNameLength/2;
+                                       rname_off = pbuffer->SymbolicLinkReparseBuffer.SubstituteNameOffset/2;
+                               }
+
                                reparsetarget = pbuffer->SymbolicLinkReparseBuffer.ReparseTarget;
                                isabsolute = (pbuffer->SymbolicLinkReparseBuffer.Flags == 0) ? 1 : 0;
                        }
                        else if(pbuffer->ReparseTag == IO_REPARSE_TAG_MOUNT_POINT) {
                                rname_len = pbuffer->MountPointReparseBuffer.PrintNameLength/2;
                                rname_off = pbuffer->MountPointReparseBuffer.PrintNameOffset/2;
+                               if(rname_len <= 0) {
+                                       rname_len = pbuffer->MountPointReparseBuffer.SubstituteNameLength/2;
+                                       rname_off = pbuffer->MountPointReparseBuffer.SubstituteNameOffset/2;
+                               }
+
                                reparsetarget = pbuffer->MountPointReparseBuffer.ReparseTarget;
                                isabsolute = 1;
                        }
@@ -706,6 +716,15 @@ static int tsrm_realpath_r(char *path, int start, int len, int *ll, time_t *t, i
                                return -1;
                        }
 
+                       if(isabsolute && rname_len > 4) {
+                               /* Skip first 4 characters if they are "\\?\" */
+                               if(reparsetarget[rname_off] == L'\\' && reparsetarget[rname_off + 1] == L'\\' &&
+                                       reparsetarget[rname_off + 2] == L'?' && reparsetarget[rname_off + 3] == L'\\') {
+                                       rname_off += 4;
+                                       rname_len -= 4;
+                               }
+                       }
+
                        /* Convert wide string to narrow string */
                        for(bufindex = 0; bufindex < rname_len; bufindex++) {
                                *(path + bufindex) = (char)(reparsetarget[rname_off + bufindex]);