summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ext/standard/dir.c15
-rwxr-xr-xmain/php_streams.h2
-rwxr-xr-xmain/streams/streams.c2
3 files changed, 18 insertions, 1 deletions
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");