From 277411480358599c6a76362b93653fcd4f56d68e Mon Sep 17 00:00:00 2001 From: sborrill Date: Sat, 28 Apr 2007 22:05:50 +0000 Subject: Patch to fix PHP bug #40326 (cannot open file from cwd if parent folder not readable). Patch will be in 5.2.2, so this patch can be removed once it has been released. --- lang/php5/Makefile | 4 +- lang/php5/distinfo | 3 +- lang/php5/patches/patch-ab | 221 +++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 225 insertions(+), 3 deletions(-) create mode 100644 lang/php5/patches/patch-ab (limited to 'lang') diff --git a/lang/php5/Makefile b/lang/php5/Makefile index 46b4f7ca126..02152413ebe 100644 --- a/lang/php5/Makefile +++ b/lang/php5/Makefile @@ -1,7 +1,7 @@ -# $NetBSD: Makefile,v 1.48 2007/02/25 20:05:11 jdolecek Exp $ +# $NetBSD: Makefile,v 1.49 2007/04/28 22:05:50 sborrill Exp $ PKGNAME= php-${PHP_BASE_VERS} -PKGREVISION= 1 +PKGREVISION= 2 CATEGORIES= lang HOMEPAGE= http://www.php.net/ diff --git a/lang/php5/distinfo b/lang/php5/distinfo index c5b2267240b..a54f597ed0a 100644 --- a/lang/php5/distinfo +++ b/lang/php5/distinfo @@ -1,9 +1,10 @@ -$NetBSD: distinfo,v 1.36 2007/02/20 20:46:20 jdolecek Exp $ +$NetBSD: distinfo,v 1.37 2007/04/28 22:05:50 sborrill Exp $ SHA1 (php-5.2.1/php-5.2.1.tar.bz2) = 978ce7cde3d988d9aa672e32e46f815a8b25baa0 RMD160 (php-5.2.1/php-5.2.1.tar.bz2) = f75078e0e43cb9c64e6d0a8d51a2ebd23cc9131d Size (php-5.2.1/php-5.2.1.tar.bz2) = 7163383 bytes SHA1 (patch-aa) = 20bc3831e435182d014b11ae9f1f6c537a21af20 +SHA1 (patch-ab) = 711ed5a8df101f8d83702ddc5438a69316945713 SHA1 (patch-ag) = 4ccb67ba6f5370b1d16b087e3e714de3e5ae604e SHA1 (patch-ah) = c7cbd4b9ea0796ea3b7491c2cffb6ddddc518587 SHA1 (patch-aj) = 54812097499c81e5cb0196ab949cc86a4f24a9cc diff --git a/lang/php5/patches/patch-ab b/lang/php5/patches/patch-ab new file mode 100644 index 00000000000..a8107ca9568 --- /dev/null +++ b/lang/php5/patches/patch-ab @@ -0,0 +1,221 @@ +$NetBSD: patch-ab,v 1.3 2007/04/28 22:05:51 sborrill Exp $ + +--- TSRM/tsrm_virtual_cwd.c.orig 2007-04-28 22:51:43.000000000 +0100 ++++ TSRM/tsrm_virtual_cwd.c 2007-04-28 22:52:15.000000000 +0100 +@@ -17,7 +17,7 @@ + +----------------------------------------------------------------------+ + */ + +-/* $Id: patch-ab,v 1.3 2007/04/28 22:05:51 sborrill Exp $ */ ++/* $Id: patch-ab,v 1.3 2007/04/28 22:05:51 sborrill Exp $ */ + + #include + #include +@@ -474,7 +474,11 @@ + realpath_cache_bucket *bucket; + time_t t = 0; + int ret; ++ int use_cache; ++ int use_relative_path = 0; + TSRMLS_FETCH(); ++ ++ use_cache = ((use_realpath != CWD_EXPAND) && CWDG(realpath_cache_size_limit)); + + if (path_length == 0) + return (0); +@@ -488,27 +492,32 @@ + /* 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 > 0)) { +- int orig_path_len; +- int state_cwd_length = state->cwd_length; ++ if (!IS_ABSOLUTE_PATH(path, path_length)) { ++ if (state->cwd_length == 0) { ++ use_cache = 0; ++ use_relative_path = 1; ++ } else { ++ int orig_path_len; ++ int state_cwd_length = state->cwd_length; + + #ifdef TSRM_WIN32 +- if (IS_SLASH(path[0])) { +- state_cwd_length = 2; +- } ++ if (IS_SLASH(path[0])) { ++ state_cwd_length = 2; ++ } + #endif +- orig_path_len = path_length + state_cwd_length + 1; +- if (orig_path_len >= MAXPATHLEN) { +- return 1; ++ orig_path_len = path_length + state_cwd_length + 1; ++ if (orig_path_len >= MAXPATHLEN) { ++ return 1; ++ } ++ memcpy(orig_path, state->cwd, state_cwd_length); ++ orig_path[state_cwd_length] = DEFAULT_SLASH; ++ memcpy(orig_path + state_cwd_length + 1, path, path_length + 1); ++ path = orig_path; ++ path_length = orig_path_len; + } +- memcpy(orig_path, state->cwd, state_cwd_length); +- orig_path[state_cwd_length] = DEFAULT_SLASH; +- memcpy(orig_path + state_cwd_length + 1, path, path_length + 1); +- path = orig_path; +- path_length = orig_path_len; + } + +- if (use_realpath != CWD_EXPAND && CWDG(realpath_cache_size_limit)) { ++ if (use_cache) { + t = CWDG(realpath_cache_ttl)?time(NULL):0; + if ((bucket = realpath_cache_find(path, path_length, t TSRMLS_CC)) != NULL) { + int len = bucket->realpath_len; +@@ -548,18 +557,19 @@ + #endif + } else { + char *ptr, *path_copy, *free_path; +- char *tok = NULL; ++ char *tok; + int ptr_length; + #ifdef TSRM_WIN32 +- int is_unc = 0; ++ int is_unc; + #endif +- + no_realpath: + + free_path = path_copy = tsrm_strndup(path, path_length); + CWD_STATE_COPY(&old_state, state); + +-#ifdef TSRM_WIN32 ++#ifdef TSRM_WIN32 ++ ret = 0; ++ is_unc = 0; + if (path_length >= 2 && path[1] == ':') { + state->cwd = (char *) realloc(state->cwd, 2 + 1); + state->cwd[0] = toupper(path[0]); +@@ -583,6 +593,7 @@ + } + #endif + ++ tok = NULL; + ptr = tsrm_strtok_r(path_copy, TOKENIZER_STRING, &tok); + while (ptr) { + ptr_length = strlen(ptr); +@@ -590,6 +601,12 @@ + if (IS_DIRECTORY_UP(ptr, ptr_length)) { + char save; + ++ if (use_relative_path) { ++ CWD_STATE_FREE(state); ++ *state = old_state; ++ return 1; ++ } ++ + save = DEFAULT_SLASH; + + #define PREVIOUS state->cwd[state->cwd_length - 1] +@@ -609,33 +626,38 @@ + state->cwd_length--; + } + } else if (!IS_DIRECTORY_CURRENT(ptr, ptr_length)) { +- state->cwd = (char *) realloc(state->cwd, state->cwd_length+ptr_length+1+1); ++ if (use_relative_path) { ++ state->cwd = (char *) realloc(state->cwd, state->cwd_length+ptr_length+1); ++ use_relative_path = 0; ++ } else { ++ 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_length < 2 || +- (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_length < 2 || ++ (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) +- /* +- Below code keeps appending to state->cwd a File system seperator +- cases where this appending should not happen is given below, +- a) sys: should just be left as it is +- b) sys:system should just be left as it is, +- Colon is allowed only in the first token as volume names alone can have the : in their names. +- Files and Directories cannot have : in their names +- So the check goes like this, +- For second token and above simply append the DEFAULT_SLASH to the state->cwd. +- For first token check for the existence of : +- if it exists don't append the DEFAULT_SLASH to the state->cwd. +- */ +- if(((state->cwd_length == 0) && (strchr(ptr, ':') == NULL)) || (state->cwd_length > 0)) { +- state->cwd[state->cwd_length++] = DEFAULT_SLASH; +- } ++ /* ++ Below code keeps appending to state->cwd a File system seperator ++ cases where this appending should not happen is given below, ++ a) sys: should just be left as it is ++ b) sys:system should just be left as it is, ++ Colon is allowed only in the first token as volume names alone can have the : in their names. ++ Files and Directories cannot have : in their names ++ So the check goes like this, ++ For second token and above simply append the DEFAULT_SLASH to the state->cwd. ++ For first token check for the existence of : ++ if it exists don't append the DEFAULT_SLASH to the state->cwd. ++ */ ++ if(((state->cwd_length == 0) && (strchr(ptr, ':') == NULL)) || (state->cwd_length > 0)) { ++ 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); + + #ifdef TSRM_WIN32 +@@ -652,14 +674,14 @@ + memcpy(&state->cwd[state->cwd_length], data.cFileName, length+1); + ptr_length = length; + FindClose(hFind); ++ ret = 0; + } else if (use_realpath == CWD_REALPATH) { + if (is_unc) { ++ /* skip share name */ + is_unc--; ++ ret = 0; + } else { +- free(free_path); +- CWD_STATE_FREE(state); +- *state = old_state; +- return 1; ++ ret = 1; + } + } + } +@@ -672,6 +694,12 @@ + + free(free_path); + ++ if ((use_realpath == CWD_REALPATH) && ret) { ++ CWD_STATE_FREE(state); ++ *state = old_state; ++ return 1; ++ } ++ + 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; +@@ -680,7 +708,7 @@ + } + } + +- if (use_realpath != CWD_EXPAND && CWDG(realpath_cache_size_limit)) { ++ if (use_cache) { + realpath_cache_add(path, path_length, state->cwd, state->cwd_length, t TSRMLS_CC); + } + -- cgit v1.2.3