summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--main/fopen_wrappers.c22
1 files changed, 17 insertions, 5 deletions
diff --git a/main/fopen_wrappers.c b/main/fopen_wrappers.c
index 63f608fb58..31c983331b 100644
--- a/main/fopen_wrappers.c
+++ b/main/fopen_wrappers.c
@@ -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);