diff options
author | Dmitry Stogov <dmitry@zend.com> | 2012-10-26 09:49:21 -0700 |
---|---|---|
committer | Dmitry Stogov <dmitry@zend.com> | 2012-10-26 09:49:21 -0700 |
commit | 0716ddcdb26bcce79a028403451c87a9c8931c6e (patch) | |
tree | 4ab097c3310ce6f2d048cfd234cd88494e0b8c6d /ext/pcre | |
parent | 01dee2c4b009d052f0fdfa07f35c181a1ac4aca0 (diff) | |
parent | 68b229ea73b5e975951b5ad02ffb315ec60fca1e (diff) | |
download | php-git-0716ddcdb26bcce79a028403451c87a9c8931c6e.tar.gz |
Merge branch 'PHP-5.4'
* PHP-5.4:
Fixed bug #63180 (Corruption of hash tables)
fix bug #63369
Conflicts:
NEWS
Diffstat (limited to 'ext/pcre')
-rw-r--r-- | ext/pcre/php_pcre.c | 18 |
1 files changed, 18 insertions, 0 deletions
diff --git a/ext/pcre/php_pcre.c b/ext/pcre/php_pcre.c index 6d393a26a7..ab33881f35 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; } /* }}} */ |