From 7390cf6e2245fef4f7ac4f886254c684c60a7936 Mon Sep 17 00:00:00 2001 From: Antony Dovgal Date: Fri, 10 Aug 2007 10:13:07 +0000 Subject: [PATCH] resolve dir before calling mktemp/mkstemp this is tested by ext/standard/tests/file/tempnam_variation2.phpt --- main/php_open_temporary_file.c | 25 +++++++++++++++++++------ 1 file changed, 19 insertions(+), 6 deletions(-) diff --git a/main/php_open_temporary_file.c b/main/php_open_temporary_file.c index 4412cc0d06..e25c5cbdc7 100644 --- a/main/php_open_temporary_file.c +++ b/main/php_open_temporary_file.c @@ -98,7 +98,8 @@ static int php_do_open_temporary_file(const char *path, const char *pfx, char ** { char *trailing_slash; char *opened_path; - int path_len = 0; + char cwd[MAXPATHLEN]; + cwd_state new_state; int fd = -1; #ifndef HAVE_MKSTEMP int open_flags = O_CREAT | O_TRUNC | O_RDWR @@ -108,25 +109,36 @@ static int php_do_open_temporary_file(const char *path, const char *pfx, char ** ; #endif - if (!path) { + if (!path || !path[0]) { return -1; } - path_len = strlen(path); + if (!VCWD_GETCWD(cwd, MAXPATHLEN)) { + cwd[0] = '\0'; + } + + new_state.cwd = strdup(cwd); + new_state.cwd_length = strlen(cwd); + + if (virtual_file_ex(&new_state, path, NULL, CWD_REALPATH)) { + free(new_state.cwd); + return -1; + } - if (!path_len || IS_SLASH(path[path_len - 1])) { + if (IS_SLASH(new_state.cwd[new_state.cwd_length - 1])) { trailing_slash = ""; } else { trailing_slash = "/"; } - if (spprintf(&opened_path, 0, "%s%s%sXXXXXX", path, trailing_slash, pfx) >= MAXPATHLEN) { + if (spprintf(&opened_path, 0, "%s%s%sXXXXXX", new_state.cwd, trailing_slash, pfx) >= MAXPATHLEN) { efree(opened_path); + free(new_state.cwd); return -1; } #ifdef PHP_WIN32 - if (GetTempFileName(path, pfx, 0, opened_path)) { + if (GetTempFileName(new_state.cwd, pfx, 0, opened_path)) { /* Some versions of windows set the temp file to be read-only, * which means that opening it will fail... */ VCWD_CHMOD(opened_path, 0600); @@ -144,6 +156,7 @@ static int php_do_open_temporary_file(const char *path, const char *pfx, char ** } else { *opened_path_p = opened_path; } + free(new_state.cwd); return fd; } /* }}} */ -- 2.40.0