Commit: 68b229ea73b5e975951b5ad02ffb315ec60fca1e Author: Dmitry Stogov <dmi...@zend.com> Fri, 26 Oct 2012 09:47:30 -0700 Parents: f2bffdc2e48174e38a059d425953e8b1c08dd4bf Branches: PHP-5.4 master
Link: http://git.php.net/?p=php-src.git;a=commitdiff;h=68b229ea73b5e975951b5ad02ffb315ec60fca1e Log: Fixed bug #63180 (Corruption of hash tables) Bugs: https://bugs.php.net/63180 Changed paths: M NEWS M ext/pcre/php_pcre.c Diff: diff --git a/NEWS b/NEWS index c846798..d95f5f4 100644 --- a/NEWS +++ b/NEWS @@ -20,6 +20,7 @@ PHP NEWS (Chris Jones) - PCRE: + . Fixed bug #63180 (Corruption of hash tables). (Dmitry) . Fixed bug #63055 (Segfault in zend_gc with SF2 testsuite). (Dmitry, Laruence) . Fixed bug #63284 (Upgrade PCRE to 8.31). (Anatoliy) diff --git a/ext/pcre/php_pcre.c b/ext/pcre/php_pcre.c index f61364c..2f892c8 100644 --- a/ext/pcre/php_pcre.c +++ b/ext/pcre/php_pcre.c @@ -248,6 +248,7 @@ PHPAPI pcre_cache_entry* pcre_get_compiled_regex_cache(char *regex, int regex_le #endif pcre_cache_entry *pce; pcre_cache_entry new_entry; + char *tmp = NULL; /* Try to lookup the cached regex entry, and if successful, just pass back the compiled pattern, otherwise go on and compile it. */ @@ -438,9 +439,26 @@ PHPAPI pcre_cache_entry* pcre_get_compiled_regex_cache(char *regex, int regex_le new_entry.locale = pestrdup(locale, 1); new_entry.tables = tables; #endif + + /* + * Interned strings are not duplicated when stored in HashTable, + * but all the interned strings created during HTTP request are removed + * at end of request. However PCRE_G(pcre_cache) must be consistent + * on the next request as well. So we disable usage of interned strings + * as hash keys especually for this table. + * See bug #63180 + */ + if (IS_INTERNED(regex)) { + regex = tmp = estrndup(regex, regex_len); + } + zend_hash_update(&PCRE_G(pcre_cache), regex, regex_len+1, (void *)&new_entry, sizeof(pcre_cache_entry), (void**)&pce); + if (tmp) { + efree(tmp); + } + return pce; } /* }}} */ -- PHP CVS Mailing List (http://www.php.net/) To unsubscribe, visit: http://www.php.net/unsub.php