summaryrefslogtreecommitdiff
path: root/TSRM/tsrm_virtual_cwd.c
diff options
context:
space:
mode:
authorDmitry Stogov <dmitry@php.net>2007-07-10 13:21:31 +0000
committerDmitry Stogov <dmitry@php.net>2007-07-10 13:21:31 +0000
commit1f8c60832069a46a3c49b6ba0e96b74f7f418fdb (patch)
treea49138eb96e97b1f1b5bbeaec00256eaa154d79d /TSRM/tsrm_virtual_cwd.c
parent8c18516f5aa0cf5a694287dd04b0d6e660d673aa (diff)
downloadphp-git-1f8c60832069a46a3c49b6ba0e96b74f7f418fdb.tar.gz
Fixed symlink("", "somthing") and link("", "somthing") in ZTS mode
Diffstat (limited to 'TSRM/tsrm_virtual_cwd.c')
-rw-r--r--TSRM/tsrm_virtual_cwd.c31
1 files changed, 27 insertions, 4 deletions
diff --git a/TSRM/tsrm_virtual_cwd.c b/TSRM/tsrm_virtual_cwd.c
index 512d615cd7..5786e0d130 100644
--- a/TSRM/tsrm_virtual_cwd.c
+++ b/TSRM/tsrm_virtual_cwd.c
@@ -481,7 +481,7 @@ CWD_API int virtual_file_ex(cwd_state *state, const char *path, verify_path_func
use_cache = ((use_realpath != CWD_EXPAND) && CWDG(realpath_cache_size_limit));
if (path_length == 0)
- return (0);
+ return (1);
if (path_length >= MAXPATHLEN)
return (1);
@@ -769,9 +769,24 @@ CWD_API char *virtual_realpath(const char *path, char *real_path TSRMLS_DC)
{
cwd_state new_state;
char *retval;
+ char cwd[MAXPATHLEN];
+
+ /* realpath("") returns CWD */
+ if (!*path) {
+ new_state.cwd = (char*)malloc(1);
+ new_state.cwd[0] = '\0';
+ new_state.cwd_length = 0;
+ if (VCWD_GETCWD(cwd, MAXPATHLEN)) {
+ path = cwd;
+ }
+ } else if (!IS_ABSOLUTE_PATH(path, strlen(path))) {
+ CWD_STATE_COPY(&new_state, &CWDG(cwd));
+ } else {
+ new_state.cwd = (char*)malloc(1);
+ new_state.cwd[0] = '\0';
+ new_state.cwd_length = 0;
+ }
- CWD_STATE_COPY(&new_state, &CWDG(cwd));
-
if (virtual_file_ex(&new_state, path, NULL, CWD_REALPATH)==0) {
int len = new_state.cwd_length>MAXPATHLEN-1?MAXPATHLEN-1:new_state.cwd_length;
@@ -1202,7 +1217,15 @@ CWD_API char *tsrm_realpath(const char *path, char *real_path TSRMLS_DC)
cwd_state new_state;
char cwd[MAXPATHLEN];
- if (!IS_ABSOLUTE_PATH(path, strlen(path)) &&
+ /* realpath("") returns CWD */
+ if (!*path) {
+ new_state.cwd = (char*)malloc(1);
+ new_state.cwd[0] = '\0';
+ new_state.cwd_length = 0;
+ if (VCWD_GETCWD(cwd, MAXPATHLEN)) {
+ path = cwd;
+ }
+ } else if (!IS_ABSOLUTE_PATH(path, strlen(path)) &&
VCWD_GETCWD(cwd, MAXPATHLEN)) {
new_state.cwd = strdup(cwd);
new_state.cwd_length = strlen(cwd);