pkgsrc-Changes-HG archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

[pkgsrc/trunk]: pkgsrc/lang/php5 Patch to fix PHP bug #40326 (cannot open fil...



details:   https://anonhg.NetBSD.org/pkgsrc/rev/2e94db5bc1a3
branches:  trunk
changeset: 528311:2e94db5bc1a3
user:      sborrill <sborrill%pkgsrc.org@localhost>
date:      Sat Apr 28 22:05:50 2007 +0000

description:
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.

diffstat:

 lang/php5/Makefile         |    4 +-
 lang/php5/distinfo         |    3 +-
 lang/php5/patches/patch-ab |  221 +++++++++++++++++++++++++++++++++++++++++++++
 3 files changed, 225 insertions(+), 3 deletions(-)

diffs (253 lines):

diff -r cf6e42e15bfc -r 2e94db5bc1a3 lang/php5/Makefile
--- a/lang/php5/Makefile        Sat Apr 28 21:32:30 2007 +0000
+++ b/lang/php5/Makefile        Sat Apr 28 22:05:50 2007 +0000
@@ -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 -r cf6e42e15bfc -r 2e94db5bc1a3 lang/php5/distinfo
--- a/lang/php5/distinfo        Sat Apr 28 21:32:30 2007 +0000
+++ b/lang/php5/distinfo        Sat Apr 28 22:05:50 2007 +0000
@@ -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 -r cf6e42e15bfc -r 2e94db5bc1a3 lang/php5/patches/patch-ab
--- /dev/null   Thu Jan 01 00:00:00 1970 +0000
+++ b/lang/php5/patches/patch-ab        Sat Apr 28 22:05:50 2007 +0000
@@ -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 <sys/types.h>
+ #include <sys/stat.h>
+@@ -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);
+       }
+ 



Home | Main Index | Thread Index | Old Index