summaryrefslogtreecommitdiff
path: root/ext/pcre
diff options
context:
space:
mode:
authorDmitry Stogov <dmitry@zend.com>2012-10-26 09:49:21 -0700
committerDmitry Stogov <dmitry@zend.com>2012-10-26 09:49:21 -0700
commit0716ddcdb26bcce79a028403451c87a9c8931c6e (patch)
tree4ab097c3310ce6f2d048cfd234cd88494e0b8c6d /ext/pcre
parent01dee2c4b009d052f0fdfa07f35c181a1ac4aca0 (diff)
parent68b229ea73b5e975951b5ad02ffb315ec60fca1e (diff)
downloadphp-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.c18
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;
}
/* }}} */