]> granicus.if.org Git - php/commitdiff
closeder/readdir/rewinddir must work only with directories
authorDmitry Stogov <dmitry@php.net>
Wed, 11 Jun 2008 09:01:56 +0000 (09:01 +0000)
committerDmitry Stogov <dmitry@php.net>
Wed, 11 Jun 2008 09:01:56 +0000 (09:01 +0000)
ext/standard/dir.c
main/php_streams.h
main/streams/streams.c

index de2bf732c4df58ac5620099adb91d505026e5106..537b8ef557dce1e35d94919d4bdbe1259641cc15 100644 (file)
@@ -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);
        }
index 91e09f8f2d64901d84cfd0f563dd4b675cabcf26..5447c954a1a6a57f5b0e86aba9d50e92bf845e4e 100755 (executable)
@@ -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 */
index bd14748b28eb0e37dad80ed8bf09f15342557da5..03aea23f60ef20370d6bc74a7ccb11d625970f91 100755 (executable)
@@ -1724,7 +1724,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");