pajoye                                   Tue, 01 Sep 2009 17:50:59 +0000

Revision: http://svn.php.net/viewvc?view=revision&revision=287950

Log:
- #48746, revert previous about volume. Fix volume support to allow all mounted 
points (with or without drives)

Bug: http://bugs.php.net/48746 (Feedback) Unable to browse directories within 
Junction Points
      
Changed paths:
    U   php/php-src/branches/PHP_5_3/TSRM/tsrm_virtual_cwd.c
    U   php/php-src/trunk/TSRM/tsrm_virtual_cwd.c

Modified: php/php-src/branches/PHP_5_3/TSRM/tsrm_virtual_cwd.c
===================================================================
--- php/php-src/branches/PHP_5_3/TSRM/tsrm_virtual_cwd.c        2009-09-01 
17:46:17 UTC (rev 287949)
+++ php/php-src/branches/PHP_5_3/TSRM/tsrm_virtual_cwd.c        2009-09-01 
17:50:59 UTC (rev 287950)
@@ -671,6 +671,7 @@
                        int bufindex = 0, rname_len = 0, isabsolute = 0;
                        wchar_t * reparsetarget;
                        WCHAR szVolumePathNames[MAX_PATH];
+                       BOOL isVolume = FALSE;

                        if(++(*ll) > LINK_MAX) {
                                return -1;
@@ -718,35 +719,36 @@
                        }

                        if(isabsolute && rname_len > 4) {
-                               /* Skip first 4 characters if they are "\\?\" 
and fetch the drive name */
-                               if ((reparsetarget[rname_off] == L'\\' && 
reparsetarget[rname_off + 1] == L'\\' &&
-                                       reparsetarget[rname_off + 2] == L'?' && 
reparsetarget[rname_off + 3] == L'\\')) {
-                                       BOOL res;
-
-                                       res = GetVolumePathNameW(reparsetarget, 
szVolumePathNames, MAX_PATH);
-                                       if (!res) {
-                                               return -1;
-                                       }
-                                       reparsetarget = szVolumePathNames;
-                                       rname_off = 0;
-                                       rname_len = wcslen(szVolumePathNames);
+                               /* Do not resolve volumes (for now). A mounted 
point can
+                                  target a volume without a drive, it is not 
certain that
+                                  all IO functions we use in php and its deps 
support
+                                  path with volume GUID instead of the DOS 
way, like:
+                                  d:\test\mnt\foo
+                                  
\\?\Volume{62d1c3f8-83b9-11de-b108-806e6f6e6963}\foo
+                               */
+                               if (wcsncmp(reparsetarget,  
L"\\??\\Volume{",11) == 0
+                                       || wcsncmp(reparsetarget,  
L"\\\\?\\Volume{",11) == 0) {
+                                       isVolume = TRUE;
                                } else
-                               /* 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'\\') {
+                                       /* do not use the \??\ and \\?\ prefix*/
+                                       if (wcsncmp(reparsetarget,  L"\\??\\", 
4) == 0
+                                               || wcsncmp(reparsetarget,  
L"\\\\?\\", 4) == 0) {
                                        rname_off += 4;
                                        rname_len -= 4;
                                }
                        }
+                       if (!isVolume) {
+                               /* Convert wide string to narrow string */
+                               for(bufindex = 0; bufindex < rname_len; 
bufindex++) {
+                                       *(path + bufindex) = 
(char)(reparsetarget[rname_off + bufindex]);
+                               }

-                       /* Convert wide string to narrow string */
-                       for(bufindex = 0; bufindex < rname_len; bufindex++) {
-                               *(path + bufindex) = 
(char)(reparsetarget[rname_off + bufindex]);
+                               *(path + bufindex) = 0;
+                               j = bufindex;
+                       } else {
+                               j = rname_len + 1;
                        }
-
-                       *(path + bufindex) = 0;
                        tsrm_free_alloca(pbuffer, use_heap_large);
-                       j = bufindex;

                        if(isabsolute == 1) {
                                if (!((j == 3) && (path[1] == ':') && (path[2] 
== '\\'))) {

Modified: php/php-src/trunk/TSRM/tsrm_virtual_cwd.c
===================================================================
--- php/php-src/trunk/TSRM/tsrm_virtual_cwd.c   2009-09-01 17:46:17 UTC (rev 
287949)
+++ php/php-src/trunk/TSRM/tsrm_virtual_cwd.c   2009-09-01 17:50:59 UTC (rev 
287950)
@@ -671,6 +671,7 @@
                        int bufindex = 0, rname_len = 0, isabsolute = 0;
                        wchar_t * reparsetarget;
                        WCHAR szVolumePathNames[MAX_PATH];
+                       BOOL isVolume = FALSE;

                        if(++(*ll) > LINK_MAX) {
                                return -1;
@@ -718,35 +719,36 @@
                        }

                        if(isabsolute && rname_len > 4) {
-                               /* Skip first 4 characters if they are "\\?\" 
and fetch the drive name */
-                               if ((reparsetarget[rname_off] == L'\\' && 
reparsetarget[rname_off + 1] == L'\\' &&
-                                       reparsetarget[rname_off + 2] == L'?' && 
reparsetarget[rname_off + 3] == L'\\')) {
-                                       BOOL res;
-
-                                       res = GetVolumePathNameW(reparsetarget, 
szVolumePathNames, MAX_PATH);
-                                       if (!res) {
-                                               return -1;
-                                       }
-                                       reparsetarget = szVolumePathNames;
-                                       rname_off = 0;
-                                       rname_len = wcslen(szVolumePathNames);
+                               /* Do not resolve volumes (for now). A mounted 
point can
+                                  target a volume without a drive, it is not 
certain that
+                                  all IO functions we use in php and its deps 
support
+                                  path with volume GUID instead of the DOS 
way, like:
+                                  d:\test\mnt\foo
+                                  
\\?\Volume{62d1c3f8-83b9-11de-b108-806e6f6e6963}\foo
+                               */
+                               if (wcsncmp(reparsetarget,  
L"\\??\\Volume{",11) == 0
+                                       || wcsncmp(reparsetarget,  
L"\\\\?\\Volume{",11) == 0) {
+                                       isVolume = TRUE;
                                } else
-                               /* 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'\\') {
+                                       /* do not use the \??\ and \\?\ prefix*/
+                                       if (wcsncmp(reparsetarget,  L"\\??\\", 
4) == 0
+                                               || wcsncmp(reparsetarget,  
L"\\\\?\\", 4) == 0) {
                                        rname_off += 4;
                                        rname_len -= 4;
                                }
                        }
+                       if (!isVolume) {
+                               /* Convert wide string to narrow string */
+                               for(bufindex = 0; bufindex < rname_len; 
bufindex++) {
+                                       *(path + bufindex) = 
(char)(reparsetarget[rname_off + bufindex]);
+                               }

-                       /* Convert wide string to narrow string */
-                       for(bufindex = 0; bufindex < rname_len; bufindex++) {
-                               *(path + bufindex) = 
(char)(reparsetarget[rname_off + bufindex]);
+                               *(path + bufindex) = 0;
+                               j = bufindex;
+                       } else {
+                               j = rname_len + 1;
                        }
-
-                       *(path + bufindex) = 0;
                        tsrm_free_alloca(pbuffer, use_heap_large);
-                       j = bufindex;

                        if(isabsolute == 1) {
                                if (!((j == 3) && (path[1] == ':') && (path[2] 
== '\\'))) {

-- 
PHP CVS Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php

Reply via email to