]> granicus.if.org Git - php/commitdiff
MFH: - Fixed Bug #43137 (rmdir() and rename() do not clear statcache)
authorJani Taskinen <jani@php.net>
Wed, 31 Oct 2007 13:23:07 +0000 (13:23 +0000)
committerJani Taskinen <jani@php.net>
Wed, 31 Oct 2007 13:23:07 +0000 (13:23 +0000)
NEWS
ext/openssl/openssl.c
ext/standard/filestat.c
ext/standard/php_filestat.h
ext/standard/tests/file/005_basic.phpt
ext/standard/tests/file/005_error.phpt
ext/standard/tests/file/bug43137.phpt [new file with mode: 0644]
main/streams/plain_wrapper.c

diff --git a/NEWS b/NEWS
index 0fc67a7707631e7f2ac837bf53b9f8bc48a0f886..845efea7220e4576c95c20b06ff552a0d29b3f9d 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -3,6 +3,7 @@ PHP                                                                        NEWS
 ?? ??? 2007, PHP 5.2.5RC2
 - Added ability to control memory consumption between request using
   ZEND_MM_COMPACT environment variable. (Dmitry)
+- Fixed bug #43137 (rmdir() and rename() do not clear statcache). (Jani)
 
 18 Oct 2007, PHP 5.2.5RC1
 - Upgraded PCRE to version 7.3 (Nuno)
index 00dbd3f64192795f5993f98ae3622d24776ce224..f6fa85ef59dcf64099c4f5dc5b5da80ef489ea00 100644 (file)
@@ -46,6 +46,9 @@
 #include <openssl/ssl.h>
 #include <openssl/pkcs12.h>
 
+/* Common */
+#include <time.h>
+
 #define DEFAULT_KEY_LENGTH     512
 #define MIN_KEY_LENGTH         384
 
index cfc364d2f4512859149b151f7e8602df25680e4e..31822375276419457057603b1be1f7713f089656 100644 (file)
@@ -698,14 +698,10 @@ PHP_FUNCTION(touch)
 /* }}} */
 #endif
 
-/* {{{ proto void clearstatcache(void)
-   Clear file stat cache */
-PHP_FUNCTION(clearstatcache)
+/* {{{ php_clear_stat_cache()
+*/
+PHPAPI void php_clear_stat_cache(TSRMLS_D)
 {
-       if (ZEND_NUM_ARGS()) {
-               WRONG_PARAM_COUNT;
-       }
-
        if (BG(CurrentStatFile)) {
                efree(BG(CurrentStatFile));
                BG(CurrentStatFile) = NULL;
@@ -718,6 +714,17 @@ PHP_FUNCTION(clearstatcache)
 }
 /* }}} */
 
+/* {{{ proto void clearstatcache(void)
+   Clear file stat cache */
+PHP_FUNCTION(clearstatcache)
+{
+       if (ZEND_NUM_ARGS()) {
+               WRONG_PARAM_COUNT;
+       }
+       php_clear_stat_cache(TSRMLS_C);
+}
+/* }}} */
+
 #define IS_LINK_OPERATION(__t) ((__t) == FS_TYPE || (__t) == FS_IS_LINK || (__t) == FS_LSTAT)
 #define IS_EXISTS_CHECK(__t) ((__t) == FS_EXISTS  || (__t) == FS_IS_W || (__t) == FS_IS_R || (__t) == FS_IS_X || (__t) == FS_IS_FILE || (__t) == FS_IS_DIR || (__t) == FS_IS_LINK)
 #define IS_ABLE_CHECK(__t) ((__t) == FS_IS_R || (__t) == FS_IS_W || (__t) == FS_IS_X)
index b0aae0a76c84ee06d1524769fdae024628b64f96..f819b2bcbf2c69bebe65f6c417e553cba1cb7915 100644 (file)
@@ -87,6 +87,7 @@ typedef unsigned int php_stat_len;
 typedef int php_stat_len;
 #endif
 
+PHPAPI void php_clear_stat_cache(TSRMLS_D);
 PHPAPI void php_stat(const char *filename, php_stat_len filename_length, int type, zval *return_value TSRMLS_DC);
 
 /* Switches for various filestat functions: */
index 44a49d8cd0648cd6a630ac90acd73805a10fe81d..5ed1118902f5329062957ac77b5bde749e278645 100644 (file)
@@ -1,5 +1,5 @@
 --TEST--
-Test fileatime(),filemtime(),filectime() & touch() functions : basic functionality
+Test fileatime(), filemtime(), filectime() & touch() functions : basic functionality
 --FILE--
 <?php
 /*
index f5eff91315a2464d06f5f6fa2a73e69054d17c09..77fd4731c3cfc5a07699ec15d04d32ec0ee950d5 100644 (file)
@@ -1,5 +1,5 @@
 --TEST--
-Test fileatime(), filemtime(), filectime() & touch() functions: error conditions 
+Test fileatime(), filemtime(), filectime() & touch() functions : error conditions 
 --FILE--
 <?php
 /*
diff --git a/ext/standard/tests/file/bug43137.phpt b/ext/standard/tests/file/bug43137.phpt
new file mode 100644 (file)
index 0000000..8125445
--- /dev/null
@@ -0,0 +1,20 @@
+--TEST--
+Bug #43137 (rmdir() and rename() do not clear statcache)
+--FILE--
+<?php
+       $toname = "TO_" . md5(microtime());
+       $dirname = "FROM_" . md5(microtime());
+
+       mkdir($dirname);
+       var_dump(is_dir($dirname)); // Expected: true
+       rename($dirname, $toname);
+       var_dump(is_dir($dirname)); // Expected: false
+       var_dump(is_dir($toname)); // Expected: true
+       rmdir($toname);
+       var_dump(is_dir($toname)); // Expected: false
+?>
+--EXPECT--
+bool(true)
+bool(false)
+bool(true)
+bool(false)
index 74c1841950b66346bccb17b42ec0cbb9e430bf53..438ba3aabd9c920c879b6742706c4006ac0d6d93 100644 (file)
@@ -24,6 +24,7 @@
 #include "php_open_temporary_file.h"
 #include "ext/standard/file.h"
 #include "ext/standard/flock_compat.h"
+#include "ext/standard/php_filestat.h"
 #include <stddef.h>
 #include <fcntl.h>
 #if HAVE_SYS_WAIT_H
@@ -1032,12 +1033,10 @@ static int php_plain_files_unlink(php_stream_wrapper *wrapper, char *url, int op
                }
                return 0;
        }
+
        /* Clear stat cache */
-       ZVAL_STRINGL(&funcname, "clearstatcache", sizeof("clearstatcache")-1, 0);
-       call_user_function_ex(CG(function_table), NULL, &funcname, &retval, 0, NULL, 0, NULL TSRMLS_CC);
-       if (retval) {
-               zval_ptr_dtor(&retval);
-       }
+       php_clear_stat_cache(TSRMLS_C);
+
        return 1;
 }
 
@@ -1107,6 +1106,9 @@ static int php_plain_files_rename(php_stream_wrapper *wrapper, char *url_from, c
         return 0;
        }
 
+       /* Clear stat cache */
+       php_clear_stat_cache(TSRMLS_C);
+
        return 1;
 }
 
@@ -1151,7 +1153,7 @@ static int php_plain_files_mkdir(php_stream_wrapper *wrapper, char *dir, int mod
                }
                else {
                        /* find a top level directory we need to create */
-                       while ( (p = strrchr(buf + offset, DEFAULT_SLASH)) || ( offset !=1 && (p = strrchr(buf, DEFAULT_SLASH))) ) {
+                       while ( (p = strrchr(buf + offset, DEFAULT_SLASH)) || (offset != 1 && (p = strrchr(buf, DEFAULT_SLASH))) ) {
                                int n = 0;
 
                                *p = '\0';
@@ -1218,6 +1220,9 @@ static int php_plain_files_rmdir(php_stream_wrapper *wrapper, char *url, int opt
                return 0;
        }
 
+       /* Clear stat cache */
+       php_clear_stat_cache(TSRMLS_C);
+
        return 1;
 }
 
@@ -1412,9 +1417,6 @@ stream_skip:
 }
 /* }}} */
 
-
-
-
 /*
  * Local variables:
  * tab-width: 4