(Tony)
- Fixed bug #40169 (CURLOPT_TCP_NODELAY only available in curl >= 7.11.2).
(Tony)
+- Fixed bug #40092 (chroot() doesn't clear realpath cache). (Dmitry)
- Fixed bug #39450 (getenv() fills other super-globals). (Ilia, Tony)
+- Fixed bug #39367 (clearstatcache() doesn't clear realpath cache).
+ (j at pureftpd dot org, Dmitry)
18 Jan 2007, PHP 5.2.1RC3
- Added read-timeout context option "timeout" for HTTP streams. (Hannes,
static void cwd_globals_dtor(virtual_cwd_globals *cwd_globals TSRMLS_DC)
{
CWD_STATE_FREE(&cwd_globals->cwd);
- {
- int i;
-
- for (i = 0; i < sizeof(cwd_globals->realpath_cache)/sizeof(cwd_globals->realpath_cache[0]); i++) {
- realpath_cache_bucket *p = cwd_globals->realpath_cache[i];
- while (p != NULL) {
- realpath_cache_bucket *r = p;
- p = p->next;
- free(r);
- }
- }
- }
+ realpath_cache_clean(TSRMLS_C);
}
static char *tsrm_strndup(const char *s, size_t length)
return h;
}
+CWD_API void realpath_cache_clean(TSRMLS_D)
+{
+ int i;
+
+ for (i = 0; i < sizeof(CWDG(realpath_cache))/sizeof(CWDG(realpath_cache)[0]); i++) {
+ realpath_cache_bucket *p = CWDG(realpath_cache)[i];
+ while (p != NULL) {
+ realpath_cache_bucket *r = p;
+ p = p->next;
+ free(r);
+ }
+ CWDG(realpath_cache)[i] = NULL;
+ }
+ CWDG(realpath_cache_size) = 0;
+}
+
+CWD_API void realpath_cache_del(const char *path, int path_len TSRMLS_DC)
+{
+ unsigned long key = realpath_cache_key(path, path_len);
+ unsigned long n = key % (sizeof(CWDG(realpath_cache)) / sizeof(CWDG(realpath_cache)[0]));
+ realpath_cache_bucket **bucket = &CWDG(realpath_cache)[n];
+
+ while (*bucket != NULL) {
+ if (key == (*bucket)->key && path_len == (*bucket)->path_len &&
+ memcmp(path, (*bucket)->path, path_len) == 0) {
+ realpath_cache_bucket *r = *bucket;
+ *bucket = (*bucket)->next;
+ CWDG(realpath_cache_size) -= sizeof(realpath_cache_bucket) + r->path_len + 1 + r->realpath_len + 1;
+ free(r);
+ return;
+ } else {
+ bucket = &(*bucket)->next;
+ }
+ }
+}
+
static inline void realpath_cache_add(const char *path, int path_len, const char *realpath, int realpath_len, time_t t TSRMLS_DC)
{
long size = sizeof(realpath_cache_bucket) + path_len + 1 + realpath_len + 1;
# define CWDG(v) (cwd_globals.v)
#endif
+CWD_API void realpath_cache_clean(TSRMLS_D);
+CWD_API void realpath_cache_del(const char *path, int path_len TSRMLS_DC);
+
/* The actual macros to be used in programs using TSRM
* If the program defines VIRTUAL_DIR it will use the
* virtual_* functions
--- /dev/null
+--TEST--
+Bug #39367 (clearstatcache() doesn't clear realpath cache)
+--FILE--
+<?php
+function test() {
+ unlink('/tmp/1link');
+ unlink('/tmp/1tmp');
+ unlink('/tmp/testfile1');
+
+ file_put_contents('/tmp/testfile1', 'ok');
+ symlink('/tmp/testfile1', '/tmp/1tmp');
+ rename('/tmp/1tmp', '/tmp/1link');
+ echo file_get_contents('/tmp/1link')."\n";
+
+ unlink('/tmp/1link');
+ clearstatcache();
+
+ echo file_get_contents('/tmp/1link')."\n";
+
+ unlink('/tmp/1link');
+ unlink('/tmp/1tmp');
+ unlink('/tmp/testfile1');
+}
+@test();
+?>
+--EXPECT--
+ok