From ca854215dbf3a8c0576460969477d12ba4b90ce4 Mon Sep 17 00:00:00 2001 From: Dmitry Stogov Date: Tue, 10 Jul 2007 13:21:11 +0000 Subject: [PATCH] Fixed symlink("", "somthing") and link("", "somthing") in ZTS mode --- TSRM/tsrm_virtual_cwd.c | 31 ++++++++++++++++--- ext/standard/link.c | 2 ++ .../symlink_link_linkinfo_is_link_error1.phpt | 1 + main/fopen_wrappers.c | 4 ++- 4 files changed, 33 insertions(+), 5 deletions(-) diff --git a/TSRM/tsrm_virtual_cwd.c b/TSRM/tsrm_virtual_cwd.c index 716fe77e8f..c2bf2731c8 100644 --- a/TSRM/tsrm_virtual_cwd.c +++ b/TSRM/tsrm_virtual_cwd.c @@ -477,11 +477,11 @@ CWD_API int virtual_file_ex(cwd_state *state, const char *path, verify_path_func int use_cache; int use_relative_path = 0; TSRMLS_FETCH(); - + 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,8 +769,23 @@ CWD_API char *virtual_realpath(const char *path, char *real_path TSRMLS_DC) { cwd_state new_state; char *retval; + char cwd[MAXPATHLEN]; - CWD_STATE_COPY(&new_state, &CWDG(cwd)); + /* 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; + } 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); diff --git a/ext/standard/link.c b/ext/standard/link.c index af95c063b3..ebda3100a4 100644 --- a/ext/standard/link.c +++ b/ext/standard/link.c @@ -123,6 +123,7 @@ PHP_FUNCTION(symlink) convert_to_string_ex(frompath); if (!expand_filepath(Z_STRVAL_PP(frompath), source_p TSRMLS_CC) || !expand_filepath(Z_STRVAL_PP(topath), dest_p TSRMLS_CC)) { + php_error_docref(NULL TSRMLS_CC, E_WARNING, "No such file or directory"); RETURN_FALSE; } @@ -179,6 +180,7 @@ PHP_FUNCTION(link) convert_to_string_ex(frompath); if (!expand_filepath(Z_STRVAL_PP(frompath), source_p TSRMLS_CC) || !expand_filepath(Z_STRVAL_PP(topath), dest_p TSRMLS_CC)) { + php_error_docref(NULL TSRMLS_CC, E_WARNING, "No such file or directory"); RETURN_FALSE; } diff --git a/ext/standard/tests/file/symlink_link_linkinfo_is_link_error1.phpt b/ext/standard/tests/file/symlink_link_linkinfo_is_link_error1.phpt index 80a8e41c65..7c16188114 100644 --- a/ext/standard/tests/file/symlink_link_linkinfo_is_link_error1.phpt +++ b/ext/standard/tests/file/symlink_link_linkinfo_is_link_error1.phpt @@ -67,6 +67,7 @@ echo "Done\n"; --CLEAN-- --EXPECTF-- *** Testing symlink() for error conditions *** diff --git a/main/fopen_wrappers.c b/main/fopen_wrappers.c index c27a60f128..63f608fb58 100644 --- a/main/fopen_wrappers.c +++ b/main/fopen_wrappers.c @@ -606,7 +606,9 @@ PHPAPI char *expand_filepath(const char *filepath, char *real_path TSRMLS_DC) char cwd[MAXPATHLEN]; char *result; - if (IS_ABSOLUTE_PATH(filepath, strlen(filepath))) { + if (!filepath[0]) { + return NULL; + } else if (IS_ABSOLUTE_PATH(filepath, strlen(filepath))) { cwd[0] = '\0'; } else{ result = VCWD_GETCWD(cwd, MAXPATHLEN); -- 2.40.0