]> granicus.if.org Git - php/commitdiff
Fix for bug 41822 and 41899. expand_filepath() will now return a relative path under...
authorRobert Thompson <ab5602@php.net>
Mon, 8 Oct 2007 02:49:26 +0000 (02:49 +0000)
committerRobert Thompson <ab5602@php.net>
Mon, 8 Oct 2007 02:49:26 +0000 (02:49 +0000)
still readable.  As far as I have been able to tell, this fix only applies to the Solaris OS where files in directories with (--x) cannot getcwd().

main/fopen_wrappers.c

index 63f608fb58e475c7b0abe0cfae74cb9f2d167887..31c983331b925d854eba9244721061765a48f048 100644 (file)
@@ -604,18 +604,30 @@ PHPAPI char *expand_filepath(const char *filepath, char *real_path TSRMLS_DC)
 {
        cwd_state new_state;
        char cwd[MAXPATHLEN];
-       char *result;
 
        if (!filepath[0]) {
                return NULL;
        } else if (IS_ABSOLUTE_PATH(filepath, strlen(filepath))) {
                cwd[0] = '\0';
-       } else{
-               result = VCWD_GETCWD(cwd, MAXPATHLEN);
-               if (!result) {
+       } else {
+               const char *iam = SG(request_info).path_translated;
+               char *result = VCWD_GETCWD(cwd, MAXPATHLEN);
+               if (!result && (iam != filepath)) {
+                       int fdtest = -1;
+                       fdtest = VCWD_OPEN(filepath, O_RDONLY);
+                       if (fdtest != -1) {
+                               /* return a relative file path if for any reason 
+                                  we cannot cannot getcwd() and the requested, 
+                                  relatively referenced file is accessible */
+                               int copy_len = strlen(filepath)>MAXPATHLEN-1?MAXPATHLEN-1:strlen(filepath);
+                               real_path = estrndup(filepath, copy_len);
+                               return real_path;
+                           }   
+                        }
+               else {
                        cwd[0] = '\0';
+                       }
                }
-       }
 
        new_state.cwd = strdup(cwd);
        new_state.cwd_length = strlen(cwd);