]> granicus.if.org Git - php/commitdiff
Accept zend_string* instead of char* in php_pcre_match_impl()
authorNikita Popov <nikita.ppv@gmail.com>
Mon, 18 Mar 2019 11:25:10 +0000 (12:25 +0100)
committerNikita Popov <nikita.ppv@gmail.com>
Mon, 18 Mar 2019 11:32:06 +0000 (12:32 +0100)
ext/fileinfo/libmagic.patch
ext/fileinfo/libmagic/softmagic.c
ext/imap/php_imap.c
ext/pcre/php_pcre.c
ext/pcre/php_pcre.h
ext/spl/spl_iterators.c

index 36723da1f052941e8dd1462700629ea8d33b54d0..06b3aefc38f8270c46cff184ac3356723abb5d65 100644 (file)
@@ -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);
index a270f97eca99a1d195195d9dbd11dbcb0a0caf42..75bde738117d6b1b02d26462e131a87580dc97b6 100644 (file)
@@ -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);
index 86a4296a986d613a10d6c346daec537fe750542d..ca002e7fcd27d910797275a0f512cb638643b50d 100644 (file)
@@ -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)) {
index 35c9956fdb39998bedb253883cb0e25b041b7ecc..d18ab6ae324477e72477ebc9a081f95e7535a51a 100644 (file)
@@ -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. */
index 2385ed414f43fc20749c155691509995eb2ee866..0377ce77a889119d57c46d2b24cf51ee546a6d49 100644 (file)
@@ -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,
index 5cddf4d46071002ce53dc8a0bf3cc58854a0e2a8..8731afec566f11f1d7472c50dec5612efdd5e4d0 100644 (file)
@@ -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;