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