From: Andrei Zmievski Date: Tue, 22 Jun 2004 22:20:38 +0000 (+0000) Subject: pcre_info() is deprecated. Hence, update to pcre_fullinfo() and do more X-Git-Tag: php-4.3.9RC1~82 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=669897add1f182ab77d73ffc0de3f40de90d222b;p=php pcre_info() is deprecated. Hence, update to pcre_fullinfo() and do more rigorous checking of return values. --- diff --git a/NEWS b/NEWS index 6f1aab0f72..b0271fe524 100644 --- a/NEWS +++ b/NEWS @@ -1,6 +1,7 @@ PHP 4 NEWS ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| ?? ??? 2004, Version 4.3.8 +- Updated PCRE to provide better error handling in certain cases. (Andrei) - Fixed bug #28868 (Internal wrapper registry not thread safe). (Sara) - Fixed bug #28818 (Apache 2 sapis do not export st_dev). (xuefer at 21cn dot com, Ilia). diff --git a/ext/pcre/php_pcre.c b/ext/pcre/php_pcre.c index 3bed679a01..59c480d730 100644 --- a/ext/pcre/php_pcre.c +++ b/ext/pcre/php_pcre.c @@ -347,7 +347,7 @@ static void php_pcre_match(INTERNAL_FUNCTION_PARAMETERS, int global) const char **stringlist; /* Holds list of subpatterns */ char *match; /* The current match */ char **subpat_names = NULL;/* Array for named subpatterns */ - int i; + int i, rc; if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, ((global) ? "ssz|ll" : "ss|zll"), ®ex, ®ex_len, &subject, &subject_len, &subpats, &flags, &start_offset) == FAILURE) { @@ -393,7 +393,12 @@ static void php_pcre_match(INTERNAL_FUNCTION_PARAMETERS, int global) } /* Calculate the size of the offsets array, and allocate memory for it. */ - pcre_fullinfo(re, extra, PCRE_INFO_CAPTURECOUNT, &num_subpats); + rc = pcre_fullinfo(re, extra, PCRE_INFO_CAPTURECOUNT, &num_subpats); + if (rc < 0) { + php_error(E_WARNING, "%s: internal pcre_fullinfo() error %d", + get_active_function_name(TSRMLS_C), rc); + RETURN_FALSE; + } num_subpats++; size_offsets = num_subpats * 3; offsets = (int *)safe_emalloc(size_offsets, sizeof(int), 0); @@ -410,10 +415,22 @@ static void php_pcre_match(INTERNAL_FUNCTION_PARAMETERS, int global) char *name_table; unsigned short name_idx; - pcre_fullinfo(re, extra, PCRE_INFO_NAMECOUNT, &name_cnt); + rc = pcre_fullinfo(re, extra, PCRE_INFO_NAMECOUNT, &name_cnt); + if (rc < 0) { + php_error(E_WARNING, "%s: internal pcre_fullinfo() error %d", + get_active_function_name(TSRMLS_C), rc); + RETURN_FALSE; + } if (name_cnt > 0) { - pcre_fullinfo(re, extra, PCRE_INFO_NAMETABLE, &name_table); - pcre_fullinfo(re, extra, PCRE_INFO_NAMEENTRYSIZE, &name_size); + int rc1, rc2; + rc1 = pcre_fullinfo(re, extra, PCRE_INFO_NAMETABLE, &name_table); + rc2 = pcre_fullinfo(re, extra, PCRE_INFO_NAMEENTRYSIZE, &name_size); + rc = rc2 ? rc2 : rc1; + if (rc < 0) { + php_error(E_WARNING, "%s: internal pcre_fullinfo() error %d", + get_active_function_name(TSRMLS_C), rc); + RETURN_FALSE; + } while (ni++ < name_cnt) { name_idx = 0xff * name_table[0] + name_table[1]; @@ -782,6 +799,7 @@ PHPAPI char *php_pcre_replace(char *regex, int regex_len, *replace_end=NULL, /* End of replacement string */ *eval_result, /* Result of eval or custom function */ walk_last; /* Last walked character */ + int rc; /* Compile regex or get it from cache. */ if ((re = pcre_get_compiled_regex(regex, &extra, &preg_options)) == NULL) { @@ -801,7 +819,13 @@ PHPAPI char *php_pcre_replace(char *regex, int regex_len, } /* Calculate the size of the offsets array, and allocate memory for it. */ - size_offsets = (pcre_info(re, NULL, NULL) + 1) * 3; + rc = pcre_fullinfo(re, extra, PCRE_INFO_CAPTURECOUNT, &size_offsets); + if (rc < 0) { + php_error(E_WARNING, "%s: internal pcre_fullinfo() error %d", + get_active_function_name(TSRMLS_C), rc); + return NULL; + } + size_offsets = (size_offsets + 1) * 3; offsets = (int *)safe_emalloc(size_offsets, sizeof(int), 0); alloc_len = 2 * subject_len + 1; @@ -1165,6 +1189,7 @@ PHP_FUNCTION(preg_split) int g_notempty = 0; /* If the match should not be empty */ char *match, /* The current match */ *last_match; /* Location of last match */ + int rc; /* Get function parameters and do error checking */ argc = ZEND_NUM_ARGS(); @@ -1199,7 +1224,13 @@ PHP_FUNCTION(preg_split) array_init(return_value); /* Calculate the size of the offsets array, and allocate memory for it. */ - size_offsets = (pcre_info(re, NULL, NULL) + 1) * 3; + rc = pcre_fullinfo(re, extra, PCRE_INFO_CAPTURECOUNT, &size_offsets); + if (rc < 0) { + php_error(E_WARNING, "%s: internal pcre_fullinfo() error %d", + get_active_function_name(TSRMLS_C), rc); + RETURN_FALSE; + } + size_offsets = (size_offsets + 1) * 3; offsets = (int *)safe_emalloc(size_offsets, sizeof(int), 0); /* Start at the beginning of the string */ @@ -1406,6 +1437,7 @@ PHP_FUNCTION(preg_grep) ulong num_key; zend_bool invert = 0; /* Whether to return non-matching entries */ + int rc; /* Get arguments and do error checking */ @@ -1435,7 +1467,13 @@ PHP_FUNCTION(preg_grep) } /* Calculate the size of the offsets array, and allocate memory for it. */ - size_offsets = (pcre_info(re, NULL, NULL) + 1) * 3; + rc = pcre_fullinfo(re, extra, PCRE_INFO_CAPTURECOUNT, &size_offsets); + if (rc < 0) { + php_error(E_WARNING, "%s: internal pcre_fullinfo() error %d", + get_active_function_name(TSRMLS_C), rc); + RETURN_FALSE; + } + size_offsets = (size_offsets + 1) * 3; offsets = (int *)safe_emalloc(size_offsets, sizeof(int), 0); /* Initialize return array */