summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--main/php.h2
-rw-r--r--main/php_virtual_cwd.c18
-rw-r--r--main/php_virtual_cwd.h1
-rw-r--r--sapi/apache/mod_php4.c2
4 files changed, 22 insertions, 1 deletions
diff --git a/main/php.h b/main/php.h
index 76494cbdd8..5e1d8d84dd 100644
--- a/main/php.h
+++ b/main/php.h
@@ -291,11 +291,13 @@ PHPAPI int cfg_get_string(char *varname, char **result);
#define PHP_GETCWD(buff, size) virtual_getcwd(buff,size)
#define PHP_FOPEN(path, mode) virtual_fopen(path, mode)
#define PHP_CHDIR(path) virtual_chdir(path)
+#define PHP_CHDIR_FILE(path) virtual_chdir_file(path)
#define PHP_GETWD(buf)
#else
#define PHP_GETCWD(buff, size) getcwd(buff,size)
#define PHP_FOPEN(path, mode) fopen(path, mode)
#define PHP_CHDIR(path) chdir(path)
+#define PHP_CHDIR_FILE(path) chdir_file(path)
#define PHP_GETWD(buf) getwd(buf)
#endif
diff --git a/main/php_virtual_cwd.c b/main/php_virtual_cwd.c
index 820db5ce40..470c28a2b3 100644
--- a/main/php_virtual_cwd.c
+++ b/main/php_virtual_cwd.c
@@ -286,6 +286,24 @@ int virtual_chdir(char *path)
return virtual_file_ex(&CWDG(cwd), path, php_is_dir_ok);
}
+int virtual_chdir_file(char *path)
+{
+ int length = strlen(path);
+
+ if (length == 0) {
+ return 1; /* Can't CD to empty string */
+ }
+ while(--length >= 0 && !IS_SLASH(path[length])) {
+ }
+
+ if (length == -1) {
+ return virtual_chdir(path);
+ }
+ path[length] = DEFAULT_SLASH;
+ return virtual_chdir(path);
+}
+
+
int virtual_filepath(char *path, char **filepath)
{
cwd_state new_state;
diff --git a/main/php_virtual_cwd.h b/main/php_virtual_cwd.h
index 8b4f40a9dc..e98bb5344c 100644
--- a/main/php_virtual_cwd.h
+++ b/main/php_virtual_cwd.h
@@ -25,6 +25,7 @@ void virtual_cwd_startup();
char *virtual_getcwd_ex(int *length);
char *virtual_getcwd(char *buf, size_t size);
int virtual_chdir(char *path);
+int virtual_chdir_file(char *path);
int virtual_filepath(char *path, char **filepath);
FILE *virtual_fopen(char *path, const char *mode);
diff --git a/sapi/apache/mod_php4.c b/sapi/apache/mod_php4.c
index 328e179080..fe062e08eb 100644
--- a/sapi/apache/mod_php4.c
+++ b/sapi/apache/mod_php4.c
@@ -483,7 +483,7 @@ int send_php(request_rec *r, int display_source_mode, char *filename)
SG(server_context) = r;
php_save_umask();
- chdir_file(filename);
+ PHP_CHDIR_FILE(filename);
add_common_vars(r);
add_cgi_vars(r);