When getcwd() fails in certain places, we end up passing a zero length cwd_state to virtual_file_ex(). This causes virtual_file_ex() to assume the path to be "/", thus: include("foo.php"); ends up trying to open, "/foo.php", which is wrong. If you want to play with this problem, its very easy to simulate on a non-broken environment, just do: #define VCWD_GETCWD(buff, size) (EACCES) (or to a func that returns EACCES in case &VCWD_GETCWD() is ever used).
-James On Sat, 15 Feb 2003, Andi Gutmans wrote: > Hey, > > The fchdir() part of the patch looks fine but I didn't quite understand the > rest. PHP only uses realpath() if it doesn't fail, so what is the exact > problem? What does that other code do? > > Andi > > At 03:29 PM 2/12/2003 -0500, James E. Flemer wrote: > >Well all the fancy new streams code in 4.3.0 seems to > >tickle a Solaris issue with getcwd(). It seems that under > >certain cases solaris' getcwd() fails when other os' work. > >Consequently 4.3.0 causes a huge ammount of breakage for > >some sites running solaris. Below is a patch that seems to > >work around the problem. This may not be the best > >approach, but it was an attempt at a quick-fix so that > >4.3.0 would be usable for now. This problem has bug > >number: #21310 [1]. Comments welcome. I'd like to commit > >this (or similar) before any more releases are made. > > > >-James <[EMAIL PROTECTED]> > > > >[1] http://bugs.php.net/21310 > > > >]] Patch sponsored by: The University of Vermont [[ > >Index: TSRM/tsrm_virtual_cwd.c > >=================================================================== > >RCS file: /repository/TSRM/tsrm_virtual_cwd.c,v > >retrieving revision 1.41 > >diff -u -b -u -r1.41 tsrm_virtual_cwd.c > >--- TSRM/tsrm_virtual_cwd.c 6 Nov 2002 18:07:22 -0000 1.41 > >+++ TSRM/tsrm_virtual_cwd.c 12 Feb 2003 04:39:11 -0000 > >@@ -303,7 +303,7 @@ > > return (0); > > > > #if !defined(TSRM_WIN32) && !defined(NETWARE) > >- if (IS_ABSOLUTE_PATH(path, path_length)) { > >+ if (IS_ABSOLUTE_PATH(path, path_length) || (state->cwd_length < 1)) > >{ > > if (use_realpath && realpath(path, resolved_path)) { > > path = resolved_path; > > path_length = strlen(path); > >@@ -363,6 +363,7 @@ > > } > > > > > >+ if (state->cwd_length > 0 || IS_ABSOLUTE_PATH(path, path_length)) { > > ptr = tsrm_strtok_r(path_copy, TOKENIZER_STRING, &tok); > > while (ptr) { > > ptr_length = strlen(ptr); > >@@ -416,6 +417,11 @@ > > state->cwd[state->cwd_length+1] = '\0'; > > state->cwd_length++; > > } > >+ } else { > >+ state->cwd = (char *) realloc(state->cwd, path_length+1); > >+ memcpy(state->cwd, path, path_length+1); > >+ state->cwd_length = path_length; > >+ } > > > > if (verify_path && verify_path(state)) { > > CWD_STATE_FREE(state); > >Index: main/main.c > >=================================================================== > >RCS file: /repository/php4/main/main.c,v > >retrieving revision 1.512.2.5 > >diff -u -b -u -r1.512.2.5 main.c > >--- main/main.c 16 Dec 2002 15:44:06 -0000 1.512.2.5 > >+++ main/main.c 12 Feb 2003 04:39:12 -0000 > >@@ -1507,7 +1507,11 @@ > > { > > zend_file_handle *prepend_file_p, *append_file_p; > > zend_file_handle prepend_file, append_file; > >+#ifdef VIRTUAL_DIR > > char *old_cwd; > >+#else > >+ int old_cwd_fd; > >+#endif > > char *old_primary_file_path = NULL; > > int retval = 0; > > > >@@ -1515,9 +1519,11 @@ > > if (php_handle_special_queries(TSRMLS_C)) { > > return 0; > > } > >+#ifdef VIRTUAL_DIR > > #define OLD_CWD_SIZE 4096 > > old_cwd = do_alloca(OLD_CWD_SIZE); > > old_cwd[0] = '\0'; > >+#endif > > > > zend_try { > > #ifdef PHP_WIN32 > >@@ -1528,7 +1534,11 @@ > > > > if (primary_file->type == ZEND_HANDLE_FILENAME > > && primary_file->filename) { > >+#ifdef VIRTUAL_DIR > > VCWD_GETCWD(old_cwd, OLD_CWD_SIZE-1); > >+#else > >+ old_cwd_fd = open(".", 0); > >+#endif > > VCWD_CHDIR_FILE(primary_file->filename); > > } > > > >@@ -1578,10 +1588,14 @@ > > > > } zend_end_try(); > > > >+#ifdef VIRTUAL_DIR > > if (old_cwd[0] != '\0') { > > VCWD_CHDIR(old_cwd); > > } > > free_alloca(old_cwd); > >+#else > >+ fchdir(old_cwd_fd); > >+#endif > > return retval; > > } > > /* }}} */ > >Index: main/safe_mode.c > >=================================================================== > >RCS file: /repository/php4/main/safe_mode.c,v > >retrieving revision 1.51 > >diff -u -b -u -r1.51 safe_mode.c > >--- main/safe_mode.c 6 Nov 2002 18:07:23 -0000 1.51 > >+++ main/safe_mode.c 12 Feb 2003 04:39:12 -0000 > >@@ -121,6 +121,8 @@ > > VCWD_REALPATH(filename, path); > > *s = DEFAULT_SLASH; > > } else { > >+ path[0] = '.'; > >+ path[1] = '\0'; > > VCWD_GETCWD(path, sizeof(path)); > > } > > } /* end CHECKUID_ALLOW_ONLY_DIR */ > > > > > >-- > >PHP Development Mailing List <http://www.php.net/> > >To unsubscribe, visit: http://www.php.net/unsub.php > -- PHP Development Mailing List <http://www.php.net/> To unsubscribe, visit: http://www.php.net/unsub.php