summaryrefslogtreecommitdiff
path: root/main/php_virtual_cwd.c
diff options
context:
space:
mode:
authorZeev Suraski <zeev@php.net>2000-04-05 19:02:28 +0000
committerZeev Suraski <zeev@php.net>2000-04-05 19:02:28 +0000
commit794f3121766c8f807f587803950e4d61b39c2950 (patch)
tree1c0069c5b2d394901bb9ceac7f36a4d3c50fc2f3 /main/php_virtual_cwd.c
parent7c70003d2202a2ca6fce8c222f2b827de028254d (diff)
downloadphp-git-794f3121766c8f807f587803950e4d61b39c2950.tar.gz
Fix a problem with the virtual directory mechanism (corruption of the filenames to open)
Diffstat (limited to 'main/php_virtual_cwd.c')
-rw-r--r--main/php_virtual_cwd.c26
1 files changed, 16 insertions, 10 deletions
diff --git a/main/php_virtual_cwd.c b/main/php_virtual_cwd.c
index 8a2ecd0278..158dcdc5e4 100644
--- a/main/php_virtual_cwd.c
+++ b/main/php_virtual_cwd.c
@@ -19,6 +19,8 @@ cwd_state main_cwd_state; /* True global */
#ifndef ZEND_WIN32
#include <unistd.h>
+#else
+#include <direct.h>
#endif
#ifndef S_ISDIR
@@ -128,7 +130,7 @@ static void cwd_globals_dtor(zend_cwd_globals *cwd_globals)
CWD_STATE_FREE(&cwd_globals->cwd);
}
-void virtual_cwd_startup()
+CWD_API void virtual_cwd_startup()
{
char cwd[1024]; /* Should probably use system define here */
char *result;
@@ -143,7 +145,7 @@ void virtual_cwd_startup()
ZEND_INIT_MODULE_GLOBALS(cwd, cwd_globals_ctor, cwd_globals_dtor);
}
-void virtual_cwd_shutdown()
+CWD_API void virtual_cwd_shutdown()
{
#ifndef ZTS
cwd_globals_dtor(&cwd_globals);
@@ -151,7 +153,7 @@ void virtual_cwd_shutdown()
free(main_cwd_state.cwd); /* Don't use CWD_STATE_FREE because the non global states will probably use emalloc()/efree() */
}
-char *virtual_getcwd_ex(int *length)
+CWD_API char *virtual_getcwd_ex(int *length)
{
cwd_state *state;
CWDLS_FETCH();
@@ -187,9 +189,9 @@ char *virtual_getcwd_ex(int *length)
/* Same semantics as UNIX getcwd() */
-char *virtual_getcwd(char *buf, size_t size)
+CWD_API char *virtual_getcwd(char *buf, size_t size)
{
- int length;
+ size_t length;
char *cwd;
cwd = virtual_getcwd_ex(&length);
@@ -209,7 +211,7 @@ char *virtual_getcwd(char *buf, size_t size)
/* returns 0 for ok, 1 for error */
-int virtual_file_ex(cwd_state *state, char *path, verify_path_func verify_path)
+CWD_API int virtual_file_ex(cwd_state *state, char *path, verify_path_func verify_path)
{
int path_length = strlen(path);
char *ptr = path;
@@ -222,6 +224,8 @@ int virtual_file_ex(cwd_state *state, char *path, verify_path_func verify_path)
if (path_length == 0)
return (0);
+ path = estrndup(path, path_length);
+
old_state = (cwd_state *) malloc(sizeof(cwd_state));
CWD_STATE_COPY(old_state, state);
@@ -289,17 +293,19 @@ int virtual_file_ex(cwd_state *state, char *path, verify_path_func verify_path)
free(old_state);
+ efree(path);
+
return (ret);
}
-int virtual_chdir(char *path)
+CWD_API int virtual_chdir(char *path)
{
CWDLS_FETCH();
return virtual_file_ex(&CWDG(cwd), path, php_is_dir_ok);
}
-int virtual_chdir_file(char *path)
+CWD_API int virtual_chdir_file(char *path)
{
int length = strlen(path);
@@ -317,7 +323,7 @@ int virtual_chdir_file(char *path)
}
-int virtual_filepath(char *path, char **filepath)
+CWD_API int virtual_filepath(char *path, char **filepath)
{
cwd_state new_state;
int retval;
@@ -330,7 +336,7 @@ int virtual_filepath(char *path, char **filepath)
return retval;
}
-FILE *virtual_fopen(char *path, const char *mode)
+CWD_API FILE *virtual_fopen(char *path, const char *mode)
{
cwd_state new_state;
FILE *f;