tony2001 Wed Oct 11 11:09:42 2006 UTC
Added files: (Branch: PHP_5_2)
/php-src/ext/mbstring/tests mb_ereg1.phpt
Modified files:
/php-src/ext/mbstring php_mbregex.c
Log:
MFH: fix segfault/leak, add test
http://cvs.php.net/viewvc.cgi/php-src/ext/mbstring/php_mbregex.c?r1=1.53.2.1&r2=1.53.2.1.2.1&diff_format=u
Index: php-src/ext/mbstring/php_mbregex.c
diff -u php-src/ext/mbstring/php_mbregex.c:1.53.2.1
php-src/ext/mbstring/php_mbregex.c:1.53.2.1.2.1
--- php-src/ext/mbstring/php_mbregex.c:1.53.2.1 Sun Jan 1 12:50:08 2006
+++ php-src/ext/mbstring/php_mbregex.c Wed Oct 11 11:09:42 2006
@@ -16,7 +16,7 @@
+----------------------------------------------------------------------+
*/
-/* $Id: php_mbregex.c,v 1.53.2.1 2006/01/01 12:50:08 sniper Exp $ */
+/* $Id: php_mbregex.c,v 1.53.2.1.2.1 2006/10/11 11:09:42 tony2001 Exp $ */
#ifdef HAVE_CONFIG_H
@@ -518,7 +518,7 @@
static void _php_mb_regex_ereg_exec(INTERNAL_FUNCTION_PARAMETERS, int icase)
{
zval tmp;
- zval *arg_pattern, *array;
+ zval **arg_pattern, *array;
char *string;
int string_len;
php_mb_regex_t *re;
@@ -529,7 +529,7 @@
array = NULL;
- if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "zs|z",
&arg_pattern, &string, &string_len, &array) == FAILURE) {
+ if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "Zs|z",
&arg_pattern, &string, &string_len, &array) == FAILURE) {
RETURN_FALSE;
}
@@ -539,18 +539,15 @@
}
/* compile the regular expression from the supplied regex */
- if (Z_TYPE_P(arg_pattern) != IS_STRING) {
+ if (Z_TYPE_PP(arg_pattern) != IS_STRING) {
/* we convert numbers to integers and treat them as a string */
- tmp = *arg_pattern;
- zval_copy_ctor(&tmp);
- if (Z_TYPE_P(&tmp) == IS_DOUBLE) {
- convert_to_long(&tmp); /* get rid of decimal places */
+ if (Z_TYPE_PP(arg_pattern) == IS_DOUBLE) {
+ convert_to_long_ex(arg_pattern); /* get rid of
decimal places */
}
- convert_to_string(&tmp);
- arg_pattern = &tmp;
+ convert_to_string_ex(arg_pattern);
/* don't bother doing an extended regex with just a number */
}
- re = php_mbregex_compile_pattern(Z_STRVAL_P(arg_pattern),
Z_STRLEN_P(arg_pattern), options, MBSTRG(current_mbctype),
MBSTRG(regex_default_syntax) TSRMLS_CC);
+ re = php_mbregex_compile_pattern(Z_STRVAL_PP(arg_pattern),
Z_STRLEN_PP(arg_pattern), options, MBSTRG(current_mbctype),
MBSTRG(regex_default_syntax) TSRMLS_CC);
if (re == NULL) {
RETVAL_FALSE;
goto out;
@@ -590,9 +587,6 @@
if (regs != NULL) {
onig_region_free(regs, 1);
}
- if (arg_pattern == &tmp) {
- zval_dtor(&tmp);
- }
}
/* }}} */
http://cvs.php.net/viewvc.cgi/php-src/ext/mbstring/tests/mb_ereg1.phpt?view=markup&rev=1.1
Index: php-src/ext/mbstring/tests/mb_ereg1.phpt
+++ php-src/ext/mbstring/tests/mb_ereg1.phpt
--TEST--
mb_ereg() and invalid arguments
--SKIPIF--
<?php if (!function_exists("mb_ereg")) print "skip"; ?>
--FILE--
<?php
$a = array(
array(1,2,3),
array("", "", ""),
array(array(), 1, ""),
array(1, array(), ""),
array(1, "", array()),
);
foreach ($a as $args) {
var_dump(mb_ereg($args[0], $args[1], $args[2]));
var_dump($args);
}
echo "Done\n";
?>
--EXPECTF--
bool(false)
array(3) {
[0]=>
int(1)
[1]=>
int(2)
[2]=>
int(3)
}
int(1)
array(3) {
[0]=>
string(0) ""
[1]=>
string(0) ""
[2]=>
array(1) {
[0]=>
bool(false)
}
}
Notice: Array to string conversion in %s on line %d
bool(false)
array(3) {
[0]=>
array(0) {
}
[1]=>
int(1)
[2]=>
string(0) ""
}
Warning: mb_ereg() expects parameter 2 to be string, array given in %s on line
%d
bool(false)
array(3) {
[0]=>
int(1)
[1]=>
array(0) {
}
[2]=>
string(0) ""
}
bool(false)
array(3) {
[0]=>
int(1)
[1]=>
string(0) ""
[2]=>
array(0) {
}
}
Done
--
PHP CVS Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php