cvs: php4 /ext/pcre php_pcre.c /ext/standard array.c

From: Date: Fri, 22 Dec 2000 16:31:43 +0000
Subject: cvs: php4 /ext/pcre php_pcre.c /ext/standard array.c
Groups: php.cvs 
Request: Send a blank email to php-cvs+get-3225@lists.php.net to get a copy of this message
andrei Fri Dec 22 08:31:43 2000 EDT Modified files: /php4/ext/pcre php_pcre.c /php4/ext/standard array.c Log: (PHP preg_replace) Fix to allow proper escaping of captured subpattern references in the replacement string. (PHP array_sum) Check that argument is an array. Index: php4/ext/pcre/php_pcre.c diff -u php4/ext/pcre/php_pcre.c:1.76 php4/ext/pcre/php_pcre.c:1.77 --- php4/ext/pcre/php_pcre.c:1.76 Fri Dec 22 04:57:07 2000 +++ php4/ext/pcre/php_pcre.c Fri Dec 22 08:31:42 2000 @@ -16,7 +16,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: php_pcre.c,v 1.76 2000/12/22 12:57:07 zeev Exp $ */ +/* $Id: php_pcre.c,v 1.77 2000/12/22 16:31:42 andrei Exp $ */ /* TODO: @@ -627,41 +627,47 @@ while (*walk) { /* If found a backreference.. */ - if (('\\' == *walk || '$' == *walk ) && walk_last != '\\' && - preg_get_backref(walk+1, &backref)) { - if (backref < count) { - /* Find the corresponding string match and substitute it - in instead of the backref */ - match = subject + offsets[backref<<1]; - match_len = offsets[(backref<<1)+1] - offsets[backref<<1]; - if (match_len) - esc_match = php_addslashes(match, match_len, &esc_match_len, 0); - else { - esc_match = match; + if ('\\' == *walk || '$' == *walk) { + if (walk_last == '\\') { + memmove(walk-1, walk, code_len - (walk - code) + 1); + walk_last = 0; + continue; + } + if (preg_get_backref(walk+1, &backref)) { + if (backref < count) { + /* Find the corresponding string match and substitute it + in instead of the backref */ + match = subject + offsets[backref<<1]; + match_len = offsets[(backref<<1)+1] - offsets[backref<<1]; + if (match_len) + esc_match = php_addslashes(match, match_len, &esc_match_len, 0); + else { + esc_match = match; + esc_match_len = 0; + } + } else { + esc_match = empty_string; esc_match_len = 0; + match_len = 0; } - } else { - esc_match = empty_string; - esc_match_len = 0; - match_len = 0; - } - sprintf(backref_buf, "%c%d", *walk, backref); - new_code = php_str_to_str(code, code_len, - backref_buf, (backref > 9) ? 3 : 2, - esc_match, esc_match_len, &new_code_len); - - /* Adjust the walk pointer */ - walk = new_code + (walk - code) + match_len; - - /* Clean up and reassign */ - if (esc_match_len) - efree(esc_match); - efree(code); - code = new_code; - code_len = new_code_len; - } else { - walk++; + sprintf(backref_buf, "%c%d", *walk, backref); + new_code = php_str_to_str(code, code_len, + backref_buf, (backref > 9) ? 3 : 2, + esc_match, esc_match_len, &new_code_len); + + /* Adjust the walk pointer */ + walk = new_code + (walk - code) + match_len; + + /* Clean up and reassign */ + if (esc_match_len) + efree(esc_match); + efree(code); + code = new_code; + code_len = new_code_len; + continue; + } } + walk++; walk_last = walk[-1]; } @@ -779,15 +785,21 @@ walk = replace; walk_last = 0; while (walk < replace_end) { - if (('\\' == *walk || '$' == *walk) && walk_last != '\\' && - preg_get_backref(walk+1, &backref)) { - if (backref < count) - new_len += offsets[(backref<<1)+1] - offsets[backref<<1]; - walk += (backref > 9) ? 3 : 2; - } else { - new_len++; - walk++; + if ('\\' == *walk || '$' == *walk) { + if (walk_last == '\\') { + walk++; + walk_last = 0; + continue; + } + if (preg_get_backref(walk+1, &backref)) { + if (backref < count) + new_len += offsets[(backref<<1)+1] - offsets[backref<<1]; + walk += (backref > 9) ? 3 : 2; + continue; + } } + new_len++; + walk++; walk_last = walk[-1]; } } @@ -816,17 +828,23 @@ walk = replace; walk_last = 0; while (walk < replace_end) { - if (('\\' == *walk || '$' == *walk) && walk_last != '\\' && - preg_get_backref(walk+1, &backref)) { - if (backref < count) { - match_len = offsets[(backref<<1)+1] - offsets[backref<<1]; - memcpy(walkbuf, subject + offsets[backref<<1], match_len); - walkbuf += match_len; + if ('\\' == *walk || '$' == *walk) { + if (walk_last == '\\') { + *(walkbuf-1) = *walk++; + walk_last = 0; + continue; + } + if (preg_get_backref(walk+1, &backref)) { + if (backref < count) { + match_len = offsets[(backref<<1)+1] - offsets[backref<<1]; + memcpy(walkbuf, subject + offsets[backref<<1], match_len); + walkbuf += match_len; + } + walk += (backref > 9) ? 3 : 2; + continue; } - walk += (backref > 9) ? 3 : 2; - } else { - *walkbuf++ = *walk++; } + *walkbuf++ = *walk++; walk_last = walk[-1]; } *walkbuf = '\0'; Index: php4/ext/standard/array.c diff -u php4/ext/standard/array.c:1.85 php4/ext/standard/array.c:1.86 --- php4/ext/standard/array.c:1.85 Fri Dec 22 04:57:08 2000 +++ php4/ext/standard/array.c Fri Dec 22 08:31:42 2000 @@ -20,7 +20,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: array.c,v 1.85 2000/12/22 12:57:08 zeev Exp $ */ +/* $Id: array.c,v 1.86 2000/12/22 16:31:42 andrei Exp $ */ #include "php.h" #include "php_ini.h" @@ -2774,6 +2774,12 @@ if (argc != 1 || zend_get_parameters_ex(argc, &input) == FAILURE) { WRONG_PARAM_COUNT; + } + + if (Z_TYPE_PP(input) != IS_ARRAY) { + php_error(E_WARNING, "The argument to %s() should be an array", + get_active_function_name()); + return; } ZVAL_LONG(return_value, 0);

« previous php.cvs (#3225) next »