From 275fa5356442d4b387cc3401aee276f5a3b452b0 Mon Sep 17 00:00:00 2001 From: Nikita Popov <nikita.ppv@gmail.com> Date: Mon, 18 Mar 2019 12:25:10 +0100 Subject: [PATCH] Accept zend_string* instead of char* in php_pcre_match_impl() --- ext/fileinfo/libmagic.patch | 8 ++++---- ext/fileinfo/libmagic/softmagic.c | 8 ++++---- ext/imap/php_imap.c | 2 +- ext/pcre/php_pcre.c | 7 +++++-- ext/pcre/php_pcre.h | 2 +- ext/spl/spl_iterators.c | 2 +- 6 files changed, 16 insertions(+), 13 deletions(-) diff --git a/ext/fileinfo/libmagic.patch b/ext/fileinfo/libmagic.patch index 36723da1f0..06b3aefc38 100644 --- a/ext/fileinfo/libmagic.patch +++ b/ext/fileinfo/libmagic.patch @@ -4147,18 +4147,18 @@ diff -u libmagic.orig/softmagic.c libmagic/softmagic.c + /* pce now contains the compiled regex */ + zval retval; + zval subpats; -+ char *haystack; ++ zend_string *haystack; + + ZVAL_NULL(&retval); + ZVAL_NULL(&subpats); + + /* Cut the search len from haystack, equals to REG_STARTEND */ -+ haystack = estrndup(ms->search.s, ms->search.s_len); ++ haystack = zend_string_init(ms->search.s, ms->search.s_len, 0); + + /* match v = 0, no match v = 1 */ -+ php_pcre_match_impl(pce, haystack, ms->search.s_len, &retval, &subpats, 0, 1, PREG_OFFSET_CAPTURE, 0); ++ php_pcre_match_impl(pce, haystack, &retval, &subpats, 0, 1, PREG_OFFSET_CAPTURE, 0); + /* Free haystack */ -+ efree(haystack); ++ zend_string_release(haystack); + + if (Z_LVAL(retval) < 0) { + zval_ptr_dtor(&subpats); diff --git a/ext/fileinfo/libmagic/softmagic.c b/ext/fileinfo/libmagic/softmagic.c index a270f97eca..75bde73811 100644 --- a/ext/fileinfo/libmagic/softmagic.c +++ b/ext/fileinfo/libmagic/softmagic.c @@ -2024,18 +2024,18 @@ magiccheck(struct magic_set *ms, struct magic *m) /* pce now contains the compiled regex */ zval retval; zval subpats; - char *haystack; + zend_string *haystack; ZVAL_NULL(&retval); ZVAL_NULL(&subpats); /* Cut the search len from haystack, equals to REG_STARTEND */ - haystack = estrndup(ms->search.s, ms->search.s_len); + haystack = zend_string_init(ms->search.s, ms->search.s_len, 0); /* match v = 0, no match v = 1 */ - php_pcre_match_impl(pce, haystack, ms->search.s_len, &retval, &subpats, 0, 1, PREG_OFFSET_CAPTURE, 0); + php_pcre_match_impl(pce, haystack, &retval, &subpats, 0, 1, PREG_OFFSET_CAPTURE, 0); /* Free haystack */ - efree(haystack); + zend_string_release(haystack); if (Z_LVAL(retval) < 0) { zval_ptr_dtor(&subpats); diff --git a/ext/imap/php_imap.c b/ext/imap/php_imap.c index 86a4296a98..ca002e7fcd 100644 --- a/ext/imap/php_imap.c +++ b/ext/imap/php_imap.c @@ -1356,7 +1356,7 @@ PHP_FUNCTION(imap_append) } zend_string_free(regex); - php_pcre_match_impl(pce, ZSTR_VAL(internal_date), ZSTR_LEN(internal_date), return_value, subpats, global, + php_pcre_match_impl(pce, internal_date, return_value, subpats, global, 0, Z_L(0), Z_L(0)); if (!Z_LVAL_P(return_value)) { diff --git a/ext/pcre/php_pcre.c b/ext/pcre/php_pcre.c index 35c9956fdb..d18ab6ae32 100644 --- a/ext/pcre/php_pcre.c +++ b/ext/pcre/php_pcre.c @@ -981,14 +981,14 @@ static void php_do_pcre_match(INTERNAL_FUNCTION_PARAMETERS, int global) /* {{{ * } pce->refcount++; - php_pcre_match_impl(pce, ZSTR_VAL(subject), ZSTR_LEN(subject), return_value, subpats, + php_pcre_match_impl(pce, subject, return_value, subpats, global, ZEND_NUM_ARGS() >= 4, flags, start_offset); pce->refcount--; } /* }}} */ /* {{{ php_pcre_match_impl() */ -PHPAPI void php_pcre_match_impl(pcre_cache_entry *pce, char *subject, size_t subject_len, zval *return_value, +PHPAPI void php_pcre_match_impl(pcre_cache_entry *pce, zend_string *subject_str, zval *return_value, zval *subpats, int global, int use_flags, zend_long flags, zend_off_t start_offset) { zval result_set, /* Holds a set of subpatterns after @@ -1010,6 +1010,9 @@ PHPAPI void php_pcre_match_impl(pcre_cache_entry *pce, char *subject, size_t sub pcre2_match_data *match_data; PCRE2_SIZE start_offset2; + char *subject = ZSTR_VAL(subject_str); + size_t subject_len = ZSTR_LEN(subject_str); + ZVAL_UNDEF(&marks); /* Overwrite the passed-in value for subpatterns with an empty array. */ diff --git a/ext/pcre/php_pcre.h b/ext/pcre/php_pcre.h index 2385ed414f..0377ce77a8 100644 --- a/ext/pcre/php_pcre.h +++ b/ext/pcre/php_pcre.h @@ -45,7 +45,7 @@ typedef struct _pcre_cache_entry pcre_cache_entry; PHPAPI pcre_cache_entry* pcre_get_compiled_regex_cache(zend_string *regex); -PHPAPI void php_pcre_match_impl( pcre_cache_entry *pce, char *subject, size_t subject_len, zval *return_value, +PHPAPI void php_pcre_match_impl(pcre_cache_entry *pce, zend_string *subject_str, zval *return_value, zval *subpats, int global, int use_flags, zend_long flags, zend_off_t start_offset); PHPAPI zend_string *php_pcre_replace_impl(pcre_cache_entry *pce, zend_string *subject_str, char *subject, size_t subject_len, zend_string *replace_str, diff --git a/ext/spl/spl_iterators.c b/ext/spl/spl_iterators.c index 5cddf4d460..8731afec56 100644 --- a/ext/spl/spl_iterators.c +++ b/ext/spl/spl_iterators.c @@ -2050,7 +2050,7 @@ SPL_METHOD(RegexIterator, accept) case REGIT_MODE_GET_MATCH: zval_ptr_dtor(&intern->current.data); ZVAL_UNDEF(&intern->current.data); - php_pcre_match_impl(intern->u.regex.pce, ZSTR_VAL(subject), ZSTR_LEN(subject), &zcount, + php_pcre_match_impl(intern->u.regex.pce, subject, &zcount, &intern->current.data, intern->u.regex.mode == REGIT_MODE_ALL_MATCHES, intern->u.regex.use_flags, intern->u.regex.preg_flags, 0); RETVAL_BOOL(Z_LVAL(zcount) > 0); break; -- 2.40.0