#21097 [Opn->Fbk]: tsrm_virtual_cwd.c/virtual_file_ex handles ".." incorrectly for UNC paths

From: Date: Fri, 20 Dec 2002 00:42:15 +0000
Subject: #21097 [Opn->Fbk]: tsrm_virtual_cwd.c/virtual_file_ex handles ".." incorrectly for UNC paths
References: 1  Groups: php.bugs 
Request: Send a blank email to php-bugs+get-28042@lists.php.net to get a copy of this message
ID: 21097 Updated by: iliaa@php.net Reported By: dwayne@lfchosting.com -Status: Open +Status: Feedback Bug Type: *Directory/Filesystem functions Operating System: Win32 PHP Version: 4.2.3 New Comment: Please try using this CVS snapshot: http://snaps.php.net/php4-latest.tar.gz For Windows: http://snaps.php.net/win32/php4-win32-latest.zip Previous Comments: ------------------------------------------------------------------------ [2002-12-19 09:17:27] dwayne@lfchosting.com On Win32, the virtual_file_ex() function in TSRM/tsrm_virtual_cwd.c doesn't handle ".." correctly when state->cwd is a UNC path. Basically, when state->cwd = "//hostname/foo/bar" and path_copy = "../file.txt", the function sets the new state->cwd to "//hostname/foo/bar/file.txt" rather than "//hostname/foo/file.txt". This breaks any PHP functions that call virtual_file_ex(), including: require "../config.inc.php"; require_once "../config.inc.php"; include "../config.inc.php"; include_once "../config.inc.php"; $f = fopen("../config.inc.php", "r"); The reason for this is that the IS_ABSOLUTE_PATH() macro returns false when given a UNC path. The following patch does not change this behaviour, but it adds additional IS_UNC_PATH() checks where appropriate: diff -bruN php-4.2.3/TSRM/tsrm_virtual_cwd.c php-4.2.3-fixed/TSRM/tsrm_virtual_cwd.c --- php-4.2.3/TSRM/tsrm_virtual_cwd.c Thu Apr 25 08:52:46 2002 +++ php-4.2.3-fixed/TSRM/tsrm_virtual_cwd.c Thu Dec 19 08:33:28 2002 @@ -346,14 +346,25 @@ #define PREVIOUS state->cwd[state->cwd_length - 1] +#ifdef TSRM_WIN32 + while ((IS_ABSOLUTE_PATH(state->cwd, state->cwd_length) || + IS_UNC_PATH(state->cwd, state->cwd_length)) && + !IS_SLASH(PREVIOUS)) { +#else while (IS_ABSOLUTE_PATH(state->cwd, state->cwd_length) && !IS_SLASH(PREVIOUS)) { +#endif save = PREVIOUS; PREVIOUS = '\0'; state->cwd_length--; } +#ifdef TSRM_WIN32 + if (!IS_ABSOLUTE_PATH(state->cwd, state->cwd_length) && + !IS_UNC_PATH(state->cwd, state->cwd_length)) { +#else if (!IS_ABSOLUTE_PATH(state->cwd, state->cwd_length)) { +#endif state->cwd[state->cwd_length++] = save; state->cwd[state->cwd_length] = '\0'; } else { ------------------------------------------------------------------------ -- Edit this bug report at http://bugs.php.net/?id=21097&edit=1

« previous php.bugs (#28042) next »