diff options
| author | Ilia Alshanetsky <iliaa@php.net> | 2002-10-21 23:35:29 +0000 |
|---|---|---|
| committer | Ilia Alshanetsky <iliaa@php.net> | 2002-10-21 23:35:29 +0000 |
| commit | d8480c808836dcf973643c058ae13afa11212ab7 (patch) | |
| tree | d28b7eba67da1821b4c358c53f35bc6f84497d86 /ext/standard/link.c | |
| parent | 0abca4f60aea1005477aea08883789e312f490cd (diff) | |
| download | php-git-d8480c808836dcf973643c058ae13afa11212ab7.tar.gz | |
Fixed symlink/link functions on ZTS builds.
Made URL detection in symlink code use php_stream_locate_url_wrapper().
Diffstat (limited to 'ext/standard/link.c')
| -rw-r--r-- | ext/standard/link.c | 56 |
1 files changed, 37 insertions, 19 deletions
diff --git a/ext/standard/link.c b/ext/standard/link.c index e24ed64567..c612076c7b 100644 --- a/ext/standard/link.c +++ b/ext/standard/link.c @@ -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 @@ PHP_FUNCTION(symlink) { 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 @@ PHP_FUNCTION(symlink) 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 @@ PHP_FUNCTION(link) { 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 @@ PHP_FUNCTION(link) 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; |
