dmitry Mon Jan 16 09:17:50 2006 UTC Modified files: /TSRM tsrm_virtual_cwd.c tsrm_virtual_cwd.h /php-src/main main.c Log: Fixed bug #36016 (realpath cache memleaks) http://cvs.php.net/viewcvs.cgi/TSRM/tsrm_virtual_cwd.c?r1=1.79&r2=1.80&diff_format=u Index: TSRM/tsrm_virtual_cwd.c diff -u TSRM/tsrm_virtual_cwd.c:1.79 TSRM/tsrm_virtual_cwd.c:1.80 --- TSRM/tsrm_virtual_cwd.c:1.79 Wed Jan 4 12:22:23 2006 +++ TSRM/tsrm_virtual_cwd.c Mon Jan 16 09:17:50 2006 @@ -17,7 +17,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: tsrm_virtual_cwd.c,v 1.79 2006/01/04 12:22:23 derick Exp $ */ +/* $Id: tsrm_virtual_cwd.c,v 1.80 2006/01/16 09:17:50 dmitry Exp $ */ #include <sys/types.h> #include <sys/stat.h> @@ -163,18 +163,15 @@ static void cwd_globals_ctor(virtual_cwd_globals *cwd_globals TSRMLS_DC) { CWD_STATE_COPY(&cwd_globals->cwd, &main_cwd_state); -#ifdef REALPATH_CACHE cwd_globals->realpath_cache_size = 0; cwd_globals->realpath_cache_size_limit = REALPATH_CACHE_SIZE; cwd_globals->realpath_cache_ttl = REALPATH_CACHE_TTL; memset(cwd_globals->realpath_cache, 0, sizeof(cwd_globals->realpath_cache)); -#endif } static void cwd_globals_dtor(virtual_cwd_globals *cwd_globals TSRMLS_DC) { CWD_STATE_FREE(&cwd_globals->cwd); -#ifdef REALPATH_CACHE { int i; @@ -187,7 +184,6 @@ } } } -#endif } static char *tsrm_strndup(const char *s, size_t length) @@ -308,7 +304,6 @@ return buf; } -#ifdef REALPATH_CACHE static inline unsigned long realpath_cache_key(const char *path, int path_len) { register unsigned long h; @@ -352,19 +347,18 @@ while (*bucket != NULL) { if (CWDG(realpath_cache_ttl) && (*bucket)->expires < t) { 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); + *bucket = (*bucket)->next; + CWDG(realpath_cache_size) -= sizeof(realpath_cache_bucket) + r->path_len + 1 + r->realpath_len + 1; + free(r); } else if (key == (*bucket)->key && path_len == (*bucket)->path_len && memcmp(path, (*bucket)->path, path_len) == 0) { return *bucket; } else { - *bucket = (*bucket)->next; + bucket = &(*bucket)->next; } } return NULL; } -#endif /* Resolve path relatively to state and put the real path into state */ @@ -385,20 +379,17 @@ #else char *new_path; #endif -#ifdef REALPATH_CACHE char orig_path[MAXPATHLEN]; int orig_path_len; realpath_cache_bucket *bucket; time_t t; TSRMLS_FETCH(); -#endif if (path_length == 0) return (0); if (path_length >= MAXPATHLEN) return (1); -#ifdef REALPATH_CACHE if (use_realpath && CWDG(realpath_cache_size_limit)) { if (IS_ABSOLUTE_PATH(path, path_length) || (state->cwd_length < 1)) { memcpy(orig_path, path, path_length+1); @@ -430,7 +421,6 @@ } } } -#endif #if !defined(TSRM_WIN32) && !defined(NETWARE) /* cwd_length can be 0 when getcwd() fails. * This can happen under solaris when a dir does not have read permissions @@ -609,11 +599,9 @@ #endif free(free_path); -#ifdef REALPATH_CACHE if (use_realpath && CWDG(realpath_cache_size_limit)) { realpath_cache_add(orig_path, orig_path_len, state->cwd, state->cwd_length, t TSRMLS_CC); } -#endif if (verify_path && verify_path(state)) { CWD_STATE_FREE(state); http://cvs.php.net/viewcvs.cgi/TSRM/tsrm_virtual_cwd.h?r1=1.50&r2=1.51&diff_format=u Index: TSRM/tsrm_virtual_cwd.h diff -u TSRM/tsrm_virtual_cwd.h:1.50 TSRM/tsrm_virtual_cwd.h:1.51 --- TSRM/tsrm_virtual_cwd.h:1.50 Wed Jan 4 12:22:23 2006 +++ TSRM/tsrm_virtual_cwd.h Mon Jan 16 09:17:50 2006 @@ -17,7 +17,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: tsrm_virtual_cwd.h,v 1.50 2006/01/04 12:22:23 derick Exp $ */ +/* $Id: tsrm_virtual_cwd.h,v 1.51 2006/01/16 09:17:50 dmitry Exp $ */ #ifndef VIRTUAL_CWD_H #define VIRTUAL_CWD_H @@ -195,11 +195,9 @@ CWD_API int virtual_file_ex(cwd_state *state, const char *path, verify_path_func verify_path, int use_realpath); -#define REALPATH_CACHE #define REALPATH_CACHE_TTL (2*60) /* 2 minutes */ #define REALPATH_CACHE_SIZE 0 /* disabled while php.ini isn't loaded */ -#ifdef REALPATH_CACHE typedef struct _realpath_cache_bucket { unsigned long key; char *path; @@ -209,16 +207,13 @@ time_t expires; struct _realpath_cache_bucket *next; } realpath_cache_bucket; -#endif typedef struct _virtual_cwd_globals { cwd_state cwd; -#ifdef REALPATH_CACHE long realpath_cache_size; long realpath_cache_size_limit; long realpath_cache_ttl; realpath_cache_bucket *realpath_cache[1024]; -#endif } virtual_cwd_globals; #ifdef ZTS http://cvs.php.net/viewcvs.cgi/php-src/main/main.c?r1=1.659&r2=1.660&diff_format=u Index: php-src/main/main.c diff -u php-src/main/main.c:1.659 php-src/main/main.c:1.660 --- php-src/main/main.c:1.659 Sun Jan 1 13:09:57 2006 +++ php-src/main/main.c Mon Jan 16 09:17:50 2006 @@ -18,7 +18,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: main.c,v 1.659 2006/01/01 13:09:57 sniper Exp $ */ +/* $Id: main.c,v 1.660 2006/01/16 09:17:50 dmitry Exp $ */ /* {{{ includes */ @@ -441,10 +441,8 @@ STD_PHP_INI_BOOLEAN("allow_url_fopen", "1", PHP_INI_SYSTEM, OnUpdateBool, allow_url_fopen, php_core_globals, core_globals) STD_PHP_INI_BOOLEAN("allow_url_include", "0", PHP_INI_SYSTEM, OnUpdateBool, allow_url_include, php_core_globals, core_globals) STD_PHP_INI_BOOLEAN("always_populate_raw_post_data", "0", PHP_INI_SYSTEM|PHP_INI_PERDIR, OnUpdateBool, always_populate_raw_post_data, php_core_globals, core_globals) -#ifdef REALPATH_CACHE STD_PHP_INI_ENTRY("realpath_cache_size", "16K", PHP_INI_SYSTEM, OnUpdateLong, realpath_cache_size_limit, virtual_cwd_globals, cwd_globals) STD_PHP_INI_ENTRY("realpath_cache_ttl", "120", PHP_INI_SYSTEM, OnUpdateLong, realpath_cache_ttl, virtual_cwd_globals, cwd_globals) -#endif PHP_INI_END() /* }}} */
-- PHP CVS Mailing List (http://www.php.net/) To unsubscribe, visit: http://www.php.net/unsub.php