From 00ea3108ea77de7bdbd23e6e557d7281a56589b0 Mon Sep 17 00:00:00 2001 From: Dmitry Stogov Date: Wed, 11 Jun 2008 09:01:44 +0000 Subject: [PATCH] closeder/readdir/rewinddir must work only with directories --- ext/standard/dir.c | 15 +++++++++++++ .../tests/dir/readdir_variation7.phpt | 1 + ext/standard/tests/dir/rewinddir_basic.phpt | 22 ++++++++++++++----- main/php_streams.h | 2 ++ main/streams/streams.c | 2 +- 5 files changed, 35 insertions(+), 7 deletions(-) diff --git a/ext/standard/dir.c b/ext/standard/dir.c index 42140297ee3..0b1caa08a62 100644 --- a/ext/standard/dir.c +++ b/ext/standard/dir.c @@ -282,6 +282,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); @@ -384,6 +389,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); } /* }}} */ @@ -398,6 +408,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_RT_STRINGL(entry.d_name, strlen(entry.d_name), ZSTR_DUPLICATE); } diff --git a/ext/standard/tests/dir/readdir_variation7.phpt b/ext/standard/tests/dir/readdir_variation7.phpt index e62e5a3b6ad..86bd43061e7 100644 --- a/ext/standard/tests/dir/readdir_variation7.phpt +++ b/ext/standard/tests/dir/readdir_variation7.phpt @@ -33,3 +33,4 @@ resource(%d) of type (stream) Warning: readdir(): %d is not a valid Directory resource in %s on line %d bool(false) +===DONE=== diff --git a/ext/standard/tests/dir/rewinddir_basic.phpt b/ext/standard/tests/dir/rewinddir_basic.phpt index f2b4235a134..22174444fab 100644 --- a/ext/standard/tests/dir/rewinddir_basic.phpt +++ b/ext/standard/tests/dir/rewinddir_basic.phpt @@ -69,16 +69,26 @@ resource(%d) of type (stream) resource(%d) of type (stream) -- Read and rewind first directory (argument supplied) -- -unicode(1) "." -unicode(2) ".." -unicode(9) "file1.tmp" +array(3) { + [0]=> + unicode(1) "." + [1]=> + unicode(2) ".." + [2]=> + unicode(9) "file1.tmp" +} NULL unicode(1) "." -- Read and rewind second directory (no argument supplied) -- -unicode(1) "." -unicode(2) ".." -unicode(9) "file2.tmp" +array(3) { + [0]=> + unicode(1) "." + [1]=> + unicode(2) ".." + [2]=> + unicode(9) "file2.tmp" +} NULL unicode(1) "." ===DONE=== diff --git a/main/php_streams.h b/main/php_streams.h index 44606f26b9a..4368aa8a292 100755 --- a/main/php_streams.h +++ b/main/php_streams.h @@ -189,6 +189,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 e917d38952c..cbc3a25301a 100755 --- a/main/streams/streams.c +++ b/main/streams/streams.c @@ -2279,7 +2279,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");