svn: /php/php-src/ branches/PHP_5_3/TSRM/tsrm_virtual_cwd.c trunk/TSRM/tsrm_virtual_cwd.c
| From: | Pierre-Alain Joye | Date: | Sat, 29 Aug 2009 12:21:47 +0000 |
| Subject: | svn: /php/php-src/ branches/PHP_5_3/TSRM/tsrm_virtual_cwd.c trunk/TSRM/tsrm_virtual_cwd.c | ||
| Groups: | php.cvs | ||
| Request: | Send a blank email to php-cvs+get-60261@lists.php.net to get a copy of this message | ||
pajoye Sat, 29 Aug 2009 12:21:47 +0000
Revision: http://svn.php.net/viewvc?view=revision&revision=287877
Log:
- Fix #48746, mounted volume support & resolution
Bug: http://bugs.php.net/48746 (Assigned) 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-08-29 10:24:56 UTC (rev 287876)
+++ php/php-src/branches/PHP_5_3/TSRM/tsrm_virtual_cwd.c 2009-08-29 12:21:47 UTC (rev 287877)
@@ -670,6 +670,7 @@
unsigned int retlength = 0, rname_off = 0;
int bufindex = 0, rname_len = 0, isabsolute = 0;
wchar_t * reparsetarget;
+ WCHAR szVolumePathNames[MAX_PATH];
if(++(*ll) > LINK_MAX) {
return -1;
@@ -717,17 +718,25 @@
}
if(isabsolute && rname_len > 4) {
- /* Skip first 4 characters if they are "\\?\" */
- if(reparsetarget[rname_off] == L'\\' && reparsetarget[rname_off + 1] ==
L'\\' &&
+ /* 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);
+ } 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'\\') {
rname_off += 4;
rname_len -= 4;
}
- 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 */
@@ -740,11 +749,13 @@
j = bufindex;
if(isabsolute == 1) {
- /* use_realpath is 0 in the call below coz path is absolute*/
- j = tsrm_realpath_r(path, 0, j, ll, t, 0, is_dir, &directory TSRMLS_CC);
- if(j < 0) {
- tsrm_free_alloca(tmp, use_heap);
- return -1;
+ if (!((j == 3) && (path[1] == ':') && (path[2] == '\\'))) {
+ /* use_realpath is 0 in the call below coz path is absolute*/
+ j = tsrm_realpath_r(path, 0, j, ll, t, 0, is_dir, &directory TSRMLS_CC);
+ if(j < 0) {
+ tsrm_free_alloca(tmp, use_heap);
+ return -1;
+ }
}
}
else {
@@ -1010,7 +1021,6 @@
add_slash = (use_realpath != CWD_REALPATH) && path_length > 0 &&
IS_SLASH(resolved_path[path_length-1]);
t = CWDG(realpath_cache_ttl) ? 0 : -1;
-
path_length = tsrm_realpath_r(resolved_path, start, path_length, &ll, &t, use_realpath, 0,
NULL TSRMLS_CC);
if (path_length < 0) {
Modified: php/php-src/trunk/TSRM/tsrm_virtual_cwd.c
===================================================================
--- php/php-src/trunk/TSRM/tsrm_virtual_cwd.c 2009-08-29 10:24:56 UTC (rev 287876)
+++ php/php-src/trunk/TSRM/tsrm_virtual_cwd.c 2009-08-29 12:21:47 UTC (rev 287877)
@@ -670,6 +670,7 @@
unsigned int retlength = 0, rname_off = 0;
int bufindex = 0, rname_len = 0, isabsolute = 0;
wchar_t * reparsetarget;
+ WCHAR szVolumePathNames[MAX_PATH];
if(++(*ll) > LINK_MAX) {
return -1;
@@ -717,17 +718,25 @@
}
if(isabsolute && rname_len > 4) {
- /* Skip first 4 characters if they are "\\?\" */
- if(reparsetarget[rname_off] == L'\\' && reparsetarget[rname_off + 1] ==
L'\\' &&
+ /* 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);
+ } 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'\\') {
rname_off += 4;
rname_len -= 4;
}
- 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 */
@@ -740,11 +749,13 @@
j = bufindex;
if(isabsolute == 1) {
- /* use_realpath is 0 in the call below coz path is absolute*/
- j = tsrm_realpath_r(path, 0, j, ll, t, 0, is_dir, &directory TSRMLS_CC);
- if(j < 0) {
- tsrm_free_alloca(tmp, use_heap);
- return -1;
+ if (!((j == 3) && (path[1] == ':') && (path[2] == '\\'))) {
+ /* use_realpath is 0 in the call below coz path is absolute*/
+ j = tsrm_realpath_r(path, 0, j, ll, t, 0, is_dir, &directory TSRMLS_CC);
+ if(j < 0) {
+ tsrm_free_alloca(tmp, use_heap);
+ return -1;
+ }
}
}
else {