cvs: php4 /ext/standard link.c TSRM tsrm_virtual_cwd.c tsrm_virtual_cwd.h

From: Date: Mon, 21 Oct 2002 23:35:29 +0000
Subject: cvs: php4 /ext/standard link.c TSRM tsrm_virtual_cwd.c tsrm_virtual_cwd.h
Groups: php.cvs 
Request: Send a blank email to php-cvs+get-15126@lists.php.net to get a copy of this message
iliaa Mon Oct 21 19:35:29 2002 EDT Modified files: /TSRM tsrm_virtual_cwd.c tsrm_virtual_cwd.h /php4/ext/standard link.c Log: Fixed symlink/link functions on ZTS builds. Made URL detection in symlink code use php_stream_locate_url_wrapper(). Index: TSRM/tsrm_virtual_cwd.c diff -u TSRM/tsrm_virtual_cwd.c:1.32 TSRM/tsrm_virtual_cwd.c:1.33 --- TSRM/tsrm_virtual_cwd.c:1.32 Sat Oct 5 07:26:17 2002 +++ TSRM/tsrm_virtual_cwd.c Mon Oct 21 19:35:28 2002 @@ -17,7 +17,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: tsrm_virtual_cwd.c,v 1.32 2002/10/05 11:26:17 dreid Exp $ */ +/* $Id: tsrm_virtual_cwd.c,v 1.33 2002/10/21 23:35:28 iliaa Exp $ */ #include <sys/types.h> #include <sys/stat.h> @@ -282,6 +282,28 @@ return buf; } +CWD_API char *virtual_link(char *buf, size_t size TSRMLS_DC) +{ + size_t length; + char *p; + char tmp_path[MAXPATHLEN * 2]; + char resolved_path[MAXPATHLEN]; + + if (IS_ABSOLUTE_PATH(buf, size)) { + memcpy(resolved_path, buf, size); + p[size] = '\0'; + return resolved_path; + } else { + virtual_getcwd(tmp_path, MAXPATHLEN TSRMLS_CC); + p = tmp_path + strlen(tmp_path); + *p++ = '/'; + memcpy(p, buf, size); + *(p + size) = '\0'; + + return tmp_path; + } +} + /* Resolve path relatively to state and put the real path into state */ /* returns 0 for ok, 1 for error */ CWD_API int virtual_file_ex(cwd_state *state, const char *path, verify_path_func verify_path) @@ -703,11 +725,13 @@ { cwd_state new_state; int retval; + char *p; CWD_STATE_COPY(&new_state, &CWDG(cwd)); - virtual_file_ex(&new_state, path, NULL); + /* virtual_file_ex(&new_state, path, NULL); */ + p = virtual_link(path, strlen(path) TSRMLS_CC); - retval = lstat(new_state.cwd, buf); + retval = lstat(p, buf); CWD_STATE_FREE(&new_state); return retval; Index: TSRM/tsrm_virtual_cwd.h diff -u TSRM/tsrm_virtual_cwd.h:1.20 TSRM/tsrm_virtual_cwd.h:1.21 --- TSRM/tsrm_virtual_cwd.h:1.20 Thu Oct 3 21:04:00 2002 +++ TSRM/tsrm_virtual_cwd.h Mon Oct 21 19:35:28 2002 @@ -17,7 +17,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: tsrm_virtual_cwd.h,v 1.20 2002/10/04 01:04:00 sas Exp $ */ +/* $Id: tsrm_virtual_cwd.h,v 1.21 2002/10/21 23:35:28 iliaa Exp $ */ #ifndef VIRTUAL_CWD_H #define VIRTUAL_CWD_H @@ -140,6 +140,7 @@ #endif #if !defined(TSRM_WIN32) && !defined(NETWARE) CWD_API int virtual_lstat(const char *path, struct stat *buf TSRMLS_DC); +CWD_API char *virtual_link(char *buf, size_t size TSRMLS_DC); #endif CWD_API int virtual_unlink(const char *path TSRMLS_DC); CWD_API int virtual_mkdir(const char *pathname, mode_t mode TSRMLS_DC); @@ -191,7 +192,7 @@ #define VCWD_RENAME(oldname, newname) virtual_rename(oldname, newname TSRMLS_CC) #define VCWD_STAT(path, buff) virtual_stat(path, buff TSRMLS_CC) #if !defined(TSRM_WIN32) && !defined(NETWARE) -#define VCWD_LSTAT(path, buff) virtual_stat(path, buff TSRMLS_CC) +#define VCWD_LSTAT(path, buff) virtual_lstat(path, buff TSRMLS_CC) #else #define VCWD_LSTAT(path, buff) virtual_lstat(path, buff TSRMLS_CC) #endif Index: php4/ext/standard/link.c diff -u php4/ext/standard/link.c:1.40 php4/ext/standard/link.c:1.41 --- php4/ext/standard/link.c:1.40 Fri Sep 6 03:30:51 2002 +++ php4/ext/standard/link.c Mon Oct 21 19:35:29 2002 @@ -16,7 +16,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: link.c,v 1.40 2002/09/06 07:30:51 derick Exp $ */ +/* $Id: link.c,v 1.41 2002/10/21 23:35:29 iliaa Exp $ */ #include "php.h" #include "php_filestat.h" @@ -57,21 +57,25 @@ PHP_FUNCTION(readlink) { zval **filename; - char buff[256]; + char buff[MAXPATHLEN]; + char *p; int ret; - + if (ZEND_NUM_ARGS() != 1 || zend_get_parameters_ex(1, &filename) == FAILURE) { WRONG_PARAM_COUNT; } convert_to_string_ex(filename); - ret = readlink(Z_STRVAL_PP(filename), buff, 255); + p = virtual_link(Z_STRVAL_PP(filename), Z_STRLEN_PP(filename) TSRMLS_CC); + + ret = readlink(p, buff, MAXPATHLEN-1); if (ret == -1) { php_error(E_WARNING, "readlink failed (%s)", strerror(errno)); RETURN_FALSE; } /* Append NULL to the end of the string */ buff[ret] = '\0'; + RETURN_STRING(buff, 1); } /* }}} */ @@ -109,6 +113,8 @@ { zval **topath, **frompath; int ret; + char source_p[MAXPATHLEN]; + char dest_p[MAXPATHLEN]; if (ZEND_NUM_ARGS() != 2 || zend_get_parameters_ex(2, &topath, &frompath) == FAILURE) { WRONG_PARAM_COUNT; @@ -116,28 +122,33 @@ convert_to_string_ex(topath); convert_to_string_ex(frompath); - if (PG(safe_mode) && !php_checkuid(Z_STRVAL_PP(topath), NULL, CHECKUID_CHECK_FILE_AND_DIR)) { - RETURN_FALSE; + expand_filepath(Z_STRVAL_PP(frompath), source_p TSRMLS_CC); + expand_filepath(Z_STRVAL_PP(topath), dest_p TSRMLS_CC); + + if (php_stream_locate_url_wrapper(source_p, NULL, STREAM_LOCATE_WRAPPERS_ONLY TSRMLS_CC) || + php_stream_locate_url_wrapper(dest_p, NULL, STREAM_LOCATE_WRAPPERS_ONLY TSRMLS_CC) ) + { + php_error(E_WARNING, "Unable to symlink to a URL"); + RETURN_FALSE; } - if (PG(safe_mode) && !php_checkuid(Z_STRVAL_PP(frompath), NULL, CHECKUID_CHECK_FILE_AND_DIR)) { + if (PG(safe_mode) && !php_checkuid(dest_p, NULL, CHECKUID_CHECK_FILE_AND_DIR)) { RETURN_FALSE; } - if (php_check_open_basedir(Z_STRVAL_PP(topath) TSRMLS_CC)) { + if (PG(safe_mode) && !php_checkuid(source_p, NULL, CHECKUID_CHECK_FILE_AND_DIR)) { RETURN_FALSE; } - if (php_check_open_basedir(Z_STRVAL_PP(frompath) TSRMLS_CC)) { + if (php_check_open_basedir(dest_p TSRMLS_CC)) { RETURN_FALSE; } - if (!strncasecmp(Z_STRVAL_PP(topath), "http://", 7) || !strncasecmp(Z_STRVAL_PP(topath), "ftp://", 6)) { - php_error(E_WARNING, "Unable to symlink to a URL"); + if (php_check_open_basedir(source_p TSRMLS_CC)) { RETURN_FALSE; } - ret = symlink(Z_STRVAL_PP(topath), Z_STRVAL_PP(frompath)); + ret = symlink(dest_p, source_p); if (ret == -1) { php_error(E_WARNING, "Symlink failed (%s)", strerror(errno)); RETURN_FALSE; @@ -153,6 +164,8 @@ { zval **topath, **frompath; int ret; + char source_p[MAXPATHLEN]; + char dest_p[MAXPATHLEN]; if (ZEND_NUM_ARGS() != 2 || zend_get_parameters_ex(2, &topath, &frompath) == FAILURE) { WRONG_PARAM_COUNT; @@ -160,28 +173,33 @@ convert_to_string_ex(topath); convert_to_string_ex(frompath); - if (PG(safe_mode) && !php_checkuid(Z_STRVAL_PP(topath), NULL, CHECKUID_CHECK_FILE_AND_DIR)) { - RETURN_FALSE; + expand_filepath(Z_STRVAL_PP(frompath), source_p TSRMLS_CC); + expand_filepath(Z_STRVAL_PP(topath), dest_p TSRMLS_CC); + + if (php_stream_locate_url_wrapper(source_p, NULL, STREAM_LOCATE_WRAPPERS_ONLY TSRMLS_CC) || + php_stream_locate_url_wrapper(dest_p, NULL, STREAM_LOCATE_WRAPPERS_ONLY TSRMLS_CC) ) + { + php_error(E_WARNING, "Unable to link to a URL"); + RETURN_FALSE; } - if (PG(safe_mode) && !php_checkuid(Z_STRVAL_PP(frompath), NULL, CHECKUID_CHECK_FILE_AND_DIR)) { + if (PG(safe_mode) && !php_checkuid(dest_p, NULL, CHECKUID_CHECK_FILE_AND_DIR)) { RETURN_FALSE; } - if (php_check_open_basedir(Z_STRVAL_PP(topath) TSRMLS_CC)) { + if (PG(safe_mode) && !php_checkuid(source_p, NULL, CHECKUID_CHECK_FILE_AND_DIR)) { RETURN_FALSE; } - if (php_check_open_basedir(Z_STRVAL_PP(frompath) TSRMLS_CC)) { + if (php_check_open_basedir(dest_p TSRMLS_CC)) { RETURN_FALSE; } - if (!strncasecmp(Z_STRVAL_PP(topath), "http://", 7) || !strncasecmp(Z_STRVAL_PP(topath), "ftp://", 6)) { - php_error(E_WARNING, "Unable to link to a URL"); + if (php_check_open_basedir(source_p TSRMLS_CC)) { RETURN_FALSE; } - ret = link(Z_STRVAL_PP(topath), Z_STRVAL_PP(frompath)); + ret = link(dest_p, source_p); if (ret == -1) { php_error(E_WARNING, "Link failed (%s)", strerror(errno)); RETURN_FALSE;

« previous php.cvs (#15126) next »