summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJani Taskinen <jani@php.net>2007-10-31 13:22:45 +0000
committerJani Taskinen <jani@php.net>2007-10-31 13:22:45 +0000
commitf552f9161877e50ced7349a6b4ed2d8caf5b0cef (patch)
tree496017d8b8e07d73e2d38b418210fe6f6c61f951
parent548c25ef1c4befddb59382a118c12a84aa8faabe (diff)
downloadphp-git-f552f9161877e50ced7349a6b4ed2d8caf5b0cef.tar.gz
MFH: - Fixed bug #43137 (rmdir() and rename() do not clear statcache)
-rw-r--r--ext/openssl/openssl.c18
-rw-r--r--ext/standard/filestat.c21
-rw-r--r--ext/standard/php_filestat.h1
-rw-r--r--ext/standard/tests/file/005_basic.phpt2
-rw-r--r--ext/standard/tests/file/005_error.phpt2
-rw-r--r--ext/standard/tests/file/bug43137.phpt20
-rw-r--r--main/streams/plain_wrapper.c20
7 files changed, 61 insertions, 23 deletions
diff --git a/ext/openssl/openssl.c b/ext/openssl/openssl.c
index 9998d2c1b8..433c885b51 100644
--- a/ext/openssl/openssl.c
+++ b/ext/openssl/openssl.c
@@ -48,6 +48,9 @@
#include <openssl/ssl.h>
#include <openssl/pkcs12.h>
+/* Common */
+#include <time.h>
+
#define DEFAULT_KEY_LENGTH 512
#define MIN_KEY_LENGTH 384
@@ -1233,7 +1236,7 @@ static int check_cert(X509_STORE *ctx, X509 *x, STACK_OF(X509) *untrustedchain,
}
/* }}} */
-/* {{{ proto int openssl_x509_checkpurpose(mixed x509cert, int purpose, array cainfo [, string untrustedfile])
+/* {{{ proto mixed openssl_x509_checkpurpose(mixed x509cert, int purpose, array cainfo [, string untrustedfile])
Checks the CERT to see if it can be used for the purpose in purpose. cainfo holds information about trusted CAs */
PHP_FUNCTION(openssl_x509_checkpurpose)
{
@@ -1244,10 +1247,9 @@ PHP_FUNCTION(openssl_x509_checkpurpose)
STACK_OF(X509) * untrustedchain = NULL;
long purpose;
char * untrusted = NULL;
- int untrusted_len;
+ int untrusted_len, ret;
- if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "Zl|a!s", &zcert, &purpose, &zcainfo, &untrusted, &untrusted_len)
- == FAILURE) {
+ if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "Zl|a!s", &zcert, &purpose, &zcainfo, &untrusted, &untrusted_len) == FAILURE) {
return;
}
@@ -1268,7 +1270,13 @@ PHP_FUNCTION(openssl_x509_checkpurpose)
if (cert == NULL) {
goto clean_exit;
}
- RETVAL_LONG(check_cert(cainfo, cert, untrustedchain, purpose));
+
+ ret = check_cert(cainfo, cert, untrustedchain, purpose);
+ if (ret != 0 && ret != 1) {
+ RETVAL_LONG(ret);
+ } else {
+ RETVAL_BOOL(ret);
+ }
clean_exit:
if (certresource == 1 && cert) {
diff --git a/ext/standard/filestat.c b/ext/standard/filestat.c
index cfc364d2f4..3182237527 100644
--- a/ext/standard/filestat.c
+++ b/ext/standard/filestat.c
@@ -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)
diff --git a/ext/standard/php_filestat.h b/ext/standard/php_filestat.h
index c8a8200d54..3517af5cb7 100644
--- a/ext/standard/php_filestat.h
+++ b/ext/standard/php_filestat.h
@@ -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: */
diff --git a/ext/standard/tests/file/005_basic.phpt b/ext/standard/tests/file/005_basic.phpt
index 44a49d8cd0..5ed1118902 100644
--- a/ext/standard/tests/file/005_basic.phpt
+++ b/ext/standard/tests/file/005_basic.phpt
@@ -1,5 +1,5 @@
--TEST--
-Test fileatime(),filemtime(),filectime() & touch() functions : basic functionality
+Test fileatime(), filemtime(), filectime() & touch() functions : basic functionality
--FILE--
<?php
/*
diff --git a/ext/standard/tests/file/005_error.phpt b/ext/standard/tests/file/005_error.phpt
index f5eff91315..77fd4731c3 100644
--- a/ext/standard/tests/file/005_error.phpt
+++ b/ext/standard/tests/file/005_error.phpt
@@ -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
index 0000000000..8125445bb0
--- /dev/null
+++ b/ext/standard/tests/file/bug43137.phpt
@@ -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)
diff --git a/main/streams/plain_wrapper.c b/main/streams/plain_wrapper.c
index 74c1841950..438ba3aabd 100644
--- a/main/streams/plain_wrapper.c
+++ b/main/streams/plain_wrapper.c
@@ -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