diff options
author | Sara Golemon <pollita@php.net> | 2003-12-01 19:47:05 +0000 |
---|---|---|
committer | Sara Golemon <pollita@php.net> | 2003-12-01 19:47:05 +0000 |
commit | 681d18effd5c8e65646593e426f2e93b10a3333f (patch) | |
tree | d072ac533c7d3cec6be83065e0b2967e7371e1f8 | |
parent | 74eed61504786f787d8c1d04e15800bae2b2b84e (diff) | |
download | php-git-681d18effd5c8e65646593e426f2e93b10a3333f.tar.gz |
Move safemode/basedir checks for url_stat to plain_wrapper.
-rw-r--r-- | ext/standard/filestat.c | 14 | ||||
-rwxr-xr-x | main/php_streams.h | 1 | ||||
-rw-r--r-- | main/streams/plain_wrapper.c | 13 |
3 files changed, 20 insertions, 8 deletions
diff --git a/ext/standard/filestat.c b/ext/standard/filestat.c index a111e0ebab..48b9955690 100644 --- a/ext/standard/filestat.c +++ b/ext/standard/filestat.c @@ -552,7 +552,7 @@ PHPAPI void php_stat(const char *filename, php_stat_len filename_length, int typ struct stat *stat_sb; #endif php_stream_statbuf ssb; - int rmask=S_IROTH, wmask=S_IWOTH, xmask=S_IXOTH; /* access rights defaults to other */ + int flags = 0, rmask=S_IROTH, wmask=S_IWOTH, xmask=S_IXOTH; /* access rights defaults to other */ char *stat_sb_names[13]={"dev", "ino", "mode", "nlink", "uid", "gid", "rdev", "size", "atime", "mtime", "ctime", "blksize", "blocks"}; @@ -560,16 +560,14 @@ PHPAPI void php_stat(const char *filename, php_stat_len filename_length, int typ RETURN_FALSE; } - if (PG(safe_mode) &&(!php_checkuid_ex(filename, NULL, CHECKUID_CHECK_FILE_AND_DIR, IS_EXISTS_CHECK(type) ? CHECKUID_NO_ERRORS : 0))) { - RETURN_FALSE; + if (IS_LINK_OPERATION(type)) { + flags |= PHP_STREAM_URL_STAT_LINK; } - - if (php_check_open_basedir_ex(filename, IS_EXISTS_CHECK(type) ? 0 : 1 TSRMLS_CC)) { - RETURN_FALSE; + if (IS_EXISTS_CHECK(type)) { + flags |= PHP_STREAM_URL_STAT_QUIET; } - - if (php_stream_stat_path_ex((char *)filename, (IS_LINK_OPERATION(type) ? PHP_STREAM_URL_STAT_LINK : 0), &ssb, NULL)) { + if (php_stream_stat_path_ex((char *)filename, flags, &ssb, NULL)) { /* Error Occured */ if (!IS_EXISTS_CHECK(type)) { php_error_docref(NULL TSRMLS_CC, E_WARNING, "%sstat failed for %s", IS_LINK_OPERATION(type) ? "L" : "", filename); diff --git a/main/php_streams.h b/main/php_streams.h index fac56a06d1..5451b8382f 100755 --- a/main/php_streams.h +++ b/main/php_streams.h @@ -319,6 +319,7 @@ PHPAPI int _php_stream_set_option(php_stream *stream, int option, int value, voi /* Flags for url_stat method in wrapper ops */ #define PHP_STREAM_URL_STAT_LINK 1 +#define PHP_STREAM_URL_STAT_QUIET 2 /* change the blocking mode of stream: value == 1 => blocking, value == 0 => non-blocking. */ #define PHP_STREAM_OPTION_BLOCKING 1 diff --git a/main/streams/plain_wrapper.c b/main/streams/plain_wrapper.c index b78c2d9651..ffaeb31bd9 100644 --- a/main/streams/plain_wrapper.c +++ b/main/streams/plain_wrapper.c @@ -898,6 +898,19 @@ static php_stream *php_plain_files_stream_opener(php_stream_wrapper *wrapper, ch static int php_plain_files_url_stater(php_stream_wrapper *wrapper, char *url, int flags, php_stream_statbuf *ssb, php_stream_context *context TSRMLS_DC) { + + if (strncmp(url, "file://", 7) == 0) { + url += 7; + } + + if (PG(safe_mode) &&(!php_checkuid_ex(url, NULL, CHECKUID_CHECK_FILE_AND_DIR, (flags & PHP_STREAM_URL_STAT_QUIET) ? CHECKUID_NO_ERRORS : 0))) { + return -1; + } + + if (php_check_open_basedir_ex(url, (flags & PHP_STREAM_URL_STAT_QUIET) ? 0 : 1 TSRMLS_CC)) { + return -1; + } + #ifdef HAVE_SYMLINK if (flags & PHP_STREAM_URL_STAT_LINK) { return VCWD_LSTAT(url, &ssb->sb); |