From: Dmitry Stogov Date: Wed, 11 Jun 2008 09:02:09 +0000 (+0000) Subject: closeder/readdir/rewinddir must work only with directories X-Git-Tag: php-5.2.7RC1~238 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=6cd3a97ce20778d46ccc93e0bdcf788246a0058f;p=php closeder/readdir/rewinddir must work only with directories --- diff --git a/ext/standard/dir.c b/ext/standard/dir.c index 2822a1fc83..bca2665080 100644 --- a/ext/standard/dir.c +++ b/ext/standard/dir.c @@ -260,6 +260,11 @@ PHP_FUNCTION(closedir) FETCH_DIRP(); + if (!(dirp->flags & PHP_STREAM_FLAG_IS_DIR)) { + php_error_docref(NULL TSRMLS_CC, E_WARNING, "%d is not a valid Directory resource", dirp->rsrc_id); + RETURN_FALSE; + } + rsrc_id = dirp->rsrc_id; zend_list_delete(dirp->rsrc_id); @@ -360,6 +365,11 @@ PHP_FUNCTION(rewinddir) FETCH_DIRP(); + if (!(dirp->flags & PHP_STREAM_FLAG_IS_DIR)) { + php_error_docref(NULL TSRMLS_CC, E_WARNING, "%d is not a valid Directory resource", dirp->rsrc_id); + RETURN_FALSE; + } + php_stream_rewinddir(dirp); } /* }}} */ @@ -374,6 +384,11 @@ PHP_NAMED_FUNCTION(php_if_readdir) FETCH_DIRP(); + if (!(dirp->flags & PHP_STREAM_FLAG_IS_DIR)) { + php_error_docref(NULL TSRMLS_CC, E_WARNING, "%d is not a valid Directory resource", dirp->rsrc_id); + RETURN_FALSE; + } + if (php_stream_readdir(dirp, &entry)) { RETURN_STRINGL(entry.d_name, strlen(entry.d_name), 1); } diff --git a/main/php_streams.h b/main/php_streams.h index b5e4ac508c..455c2c8505 100755 --- a/main/php_streams.h +++ b/main/php_streams.h @@ -181,6 +181,8 @@ struct _php_stream_wrapper { #define PHP_STREAM_FLAG_NO_CLOSE 32 +#define PHP_STREAM_FLAG_IS_DIR 64 + struct _php_stream { php_stream_ops *ops; void *abstract; /* convenience pointer for abstraction */ diff --git a/main/streams/streams.c b/main/streams/streams.c index 1adb033ece..0e3db11692 100755 --- a/main/streams/streams.c +++ b/main/streams/streams.c @@ -1706,7 +1706,7 @@ PHPAPI php_stream *_php_stream_opendir(char *path, int options, if (stream) { stream->wrapper = wrapper; - stream->flags |= PHP_STREAM_FLAG_NO_BUFFER; + stream->flags |= PHP_STREAM_FLAG_NO_BUFFER | PHP_STREAM_FLAG_IS_DIR; } } else if (wrapper) { php_stream_wrapper_log_error(wrapper, options ^ REPORT_ERRORS TSRMLS_CC, "not implemented");