wez Mon Mar 17 08:40:46 2003 EDT Modified files: /php4 acinclude.m4 configure.in /TSRM tsrm_virtual_cwd.c /php4/main main.c safe_mode.c Log: Fix for Bug #21310, based on a patch by [EMAIL PROTECTED]
Index: php4/acinclude.m4 diff -u php4/acinclude.m4:1.231 php4/acinclude.m4:1.232 --- php4/acinclude.m4:1.231 Tue Mar 11 21:26:46 2003 +++ php4/acinclude.m4 Mon Mar 17 08:40:42 2003 @@ -1,4 +1,4 @@ -dnl $Id: acinclude.m4,v 1.231 2003/03/12 02:26:46 sniper Exp $ +dnl $Id: acinclude.m4,v 1.232 2003/03/17 13:40:42 wez Exp $ dnl dnl This file contains local autoconf functions. @@ -1439,6 +1439,20 @@ if test "$ac_cv_ebcdic" = "yes"; then AC_DEFINE(CHARSET_EBCDIC,1, [Define if system uses EBCDIC]) fi +]) + +dnl Some systems, notably Solaris, cause getcwd() or realpath to fail if a +dnl component of the path has execute but not read permissions +AC_DEFUN([PHP_BROKEN_GETCWD],[ + AC_MSG_CHECKING([for broken getcwd]) + os=`uname -sr 2>/dev/null` + case $os in + SunOS*) + AC_DEFINE(HAVE_BROKEN_GETCWD,1, [Define if system has broken getcwd]) + AC_MSG_RESULT([yes]);; + *) + AC_MSG_RESULT([no]);; + esac ]) AC_DEFUN([PHP_BROKEN_GLIBC_FOPEN_APPEND],[ Index: php4/configure.in diff -u php4/configure.in:1.430 php4/configure.in:1.431 --- php4/configure.in:1.430 Mon Mar 10 09:32:47 2003 +++ php4/configure.in Mon Mar 17 08:40:42 2003 @@ -1,4 +1,4 @@ -dnl ## $Id: configure.in,v 1.430 2003/03/10 14:32:47 sniper Exp $ -*- sh -*- +dnl ## $Id: configure.in,v 1.431 2003/03/17 13:40:42 wez Exp $ -*- sh -*- dnl ## Process this file with autoconf to produce a configure script. divert(1) @@ -378,6 +378,7 @@ ]) PHP_FOPENCOOKIE +PHP_BROKEN_GETCWD PHP_BROKEN_GLIBC_FOPEN_APPEND dnl Checks for typedefs, structures, and compiler characteristics. Index: TSRM/tsrm_virtual_cwd.c diff -u TSRM/tsrm_virtual_cwd.c:1.46 TSRM/tsrm_virtual_cwd.c:1.47 --- TSRM/tsrm_virtual_cwd.c:1.46 Sat Feb 8 22:49:42 2003 +++ TSRM/tsrm_virtual_cwd.c Mon Mar 17 08:40:43 2003 @@ -17,7 +17,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: tsrm_virtual_cwd.c,v 1.46 2003/02/09 03:49:42 shane Exp $ */ +/* $Id: tsrm_virtual_cwd.c,v 1.47 2003/03/17 13:40:43 wez Exp $ */ #include <sys/types.h> #include <sys/stat.h> @@ -303,7 +303,10 @@ return (0); #if !defined(TSRM_WIN32) && !defined(NETWARE) - if (IS_ABSOLUTE_PATH(path, path_length)) { + /* cwd_length can be 0 when getcwd() fails. + * This can happen under solaris when a dir does not have read permissions + * but *does* have execute permissions */ + 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); @@ -360,58 +363,64 @@ } - ptr = tsrm_strtok_r(path_copy, TOKENIZER_STRING, &tok); - while (ptr) { - ptr_length = strlen(ptr); + 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); - if (IS_DIRECTORY_UP(ptr, ptr_length)) { - char save; + if (IS_DIRECTORY_UP(ptr, ptr_length)) { + char save; - save = DEFAULT_SLASH; + save = DEFAULT_SLASH; #define PREVIOUS state->cwd[state->cwd_length - 1] - while (IS_ABSOLUTE_PATH(state->cwd, state->cwd_length) && - !IS_SLASH(PREVIOUS)) { - save = PREVIOUS; - PREVIOUS = '\0'; - state->cwd_length--; - } - - if (!IS_ABSOLUTE_PATH(state->cwd, state->cwd_length)) { - state->cwd[state->cwd_length++] = save; - state->cwd[state->cwd_length] = '\0'; - } else { - PREVIOUS = '\0'; - state->cwd_length--; - } - } else if (!IS_DIRECTORY_CURRENT(ptr, ptr_length)) { - state->cwd = (char *) realloc(state->cwd, state->cwd_length+ptr_length+1+1); + while (IS_ABSOLUTE_PATH(state->cwd, state->cwd_length) && + !IS_SLASH(PREVIOUS)) { + save = PREVIOUS; + PREVIOUS = '\0'; + state->cwd_length--; + } + + if (!IS_ABSOLUTE_PATH(state->cwd, state->cwd_length)) { + state->cwd[state->cwd_length++] = save; + state->cwd[state->cwd_length] = '\0'; + } else { + PREVIOUS = '\0'; + state->cwd_length--; + } + } else if (!IS_DIRECTORY_CURRENT(ptr, ptr_length)) { + state->cwd = (char *) realloc(state->cwd, state->cwd_length+ptr_length+1+1); #ifdef TSRM_WIN32 - /* Windows 9x will consider C:\\Foo as a network path. Avoid it. */ - if ((state->cwd[state->cwd_length-1]!='\\' && state->cwd[state->cwd_length-1]!='/') || - IsDBCSLeadByte(state->cwd[state->cwd_length-2])) { - state->cwd[state->cwd_length++] = DEFAULT_SLASH; - } + /* Windows 9x will consider C:\\Foo as a network path. Avoid it. */ + if ((state->cwd[state->cwd_length-1]!='\\' && state->cwd[state->cwd_length-1]!='/') || + IsDBCSLeadByte(state->cwd[state->cwd_length-2])) { + state->cwd[state->cwd_length++] = DEFAULT_SLASH; + } #elif defined(NETWARE) - /* If the token is a volume name, it will have colon at the end -- so, no slash before it */ - if (ptr[ptr_length-1] != ':') { - state->cwd[state->cwd_length++] = DEFAULT_SLASH; - } + /* If the token is a volume name, it will have colon at the end -- so, no slash before it */ + if (ptr[ptr_length-1] != ':') { + state->cwd[state->cwd_length++] = DEFAULT_SLASH; + } #else - state->cwd[state->cwd_length++] = DEFAULT_SLASH; + state->cwd[state->cwd_length++] = DEFAULT_SLASH; #endif - memcpy(&state->cwd[state->cwd_length], ptr, ptr_length+1); - state->cwd_length += ptr_length; + memcpy(&state->cwd[state->cwd_length], ptr, ptr_length+1); + state->cwd_length += ptr_length; + } + ptr = tsrm_strtok_r(NULL, TOKENIZER_STRING, &tok); } - ptr = tsrm_strtok_r(NULL, TOKENIZER_STRING, &tok); - } - if (state->cwd_length == COPY_WHEN_ABSOLUTE(state->cwd)) { - state->cwd = (char *) realloc(state->cwd, state->cwd_length+1+1); - state->cwd[state->cwd_length] = DEFAULT_SLASH; - state->cwd[state->cwd_length+1] = '\0'; - state->cwd_length++; + if (state->cwd_length == COPY_WHEN_ABSOLUTE(state->cwd)) { + state->cwd = (char *) realloc(state->cwd, state->cwd_length+1+1); + state->cwd[state->cwd_length] = DEFAULT_SLASH; + 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)) { Index: php4/main/main.c diff -u php4/main/main.c:1.540 php4/main/main.c:1.541 --- php4/main/main.c:1.540 Sun Mar 16 15:47:56 2003 +++ php4/main/main.c Mon Mar 17 08:40:44 2003 @@ -18,7 +18,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: main.c,v 1.540 2003/03/16 20:47:56 helly Exp $ */ +/* $Id: main.c,v 1.541 2003/03/17 13:40:44 wez Exp $ */ /* {{{ includes */ @@ -1507,7 +1507,11 @@ { zend_file_handle *prepend_file_p, *append_file_p; zend_file_handle prepend_file, append_file; +#if HAVE_BROKEN_GETCWD + int old_cwd_fd; +#else char *old_cwd; +#endif char *old_primary_file_path = NULL; int retval = 0; @@ -1515,9 +1519,11 @@ if (php_handle_special_queries(TSRMLS_C)) { return 0; } -#define OLD_CWD_SIZE 4096 +#ifndef HAVE_BROKEN_GETCWD +# 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,12 @@ if (primary_file->type == ZEND_HANDLE_FILENAME && primary_file->filename) { +#if HAVE_BROKEN_GETCWD + /* this looks nasty to me */ + old_cwd_fd = open(".", 0); +#else VCWD_GETCWD(old_cwd, OLD_CWD_SIZE-1); +#endif VCWD_CHDIR_FILE(primary_file->filename); } @@ -1580,10 +1591,15 @@ } zend_end_try(); +#if HAVE_BROKEN_GETCWD + fchdir(old_cwd_fd); + close(old_cwd_fd); +#else if (old_cwd[0] != '\0') { VCWD_CHDIR(old_cwd); } free_alloca(old_cwd); +#endif return retval; } /* }}} */ Index: php4/main/safe_mode.c diff -u php4/main/safe_mode.c:1.55 php4/main/safe_mode.c:1.56 --- php4/main/safe_mode.c:1.55 Wed Feb 19 03:40:19 2003 +++ php4/main/safe_mode.c Mon Mar 17 08:40:45 2003 @@ -16,7 +16,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: safe_mode.c,v 1.55 2003/02/19 08:40:19 sniper Exp $ */ +/* $Id: safe_mode.c,v 1.56 2003/03/17 13:40:45 wez Exp $ */ #include "php.h" @@ -126,6 +126,11 @@ VCWD_REALPATH(filename, path); *s = DEFAULT_SLASH; } else { + /* Under Solaris, getcwd() can fail if there are no + * read permissions on a component of the path, even + * though it has the required x permissions */ + path[0] = '.'; + path[1] = '\0'; VCWD_GETCWD(path, sizeof(path)); } } /* end CHECKUID_ALLOW_ONLY_DIR */
-- PHP CVS Mailing List (http://www.php.net/) To unsubscribe, visit: http://www.php.net/unsub.php