From 882f97042b55d8f7d3c50f453c56b984334247f2 Mon Sep 17 00:00:00 2001 From: Francois Laupretre Date: Mon, 4 Jan 2016 16:31:52 +0100 Subject: [PATCH] mb_ereg_search_setpos(): Add support for negative position Also add missing test for this function --- ext/mbstring/php_mbregex.c | 5 ++ ext/mbstring/tests/mb_ereg_search_setpos.phpt | 70 +++++++++++++++++++ 2 files changed, 75 insertions(+) create mode 100644 ext/mbstring/tests/mb_ereg_search_setpos.phpt diff --git a/ext/mbstring/php_mbregex.c b/ext/mbstring/php_mbregex.c index 1bd26d7334..6a9ab193af 100644 --- a/ext/mbstring/php_mbregex.c +++ b/ext/mbstring/php_mbregex.c @@ -1400,6 +1400,11 @@ PHP_FUNCTION(mb_ereg_search_setpos) return; } + /* Accept negative position if length of search string can be determined */ + if ((position < 0) && (!Z_ISUNDEF(MBREX(search_str))) && (Z_TYPE(MBREX(search_str)) == IS_STRING)) { + position += Z_STRLEN(MBREX(search_str)); + } + if (position < 0 || (!Z_ISUNDEF(MBREX(search_str)) && Z_TYPE(MBREX(search_str)) == IS_STRING && (size_t)position >= Z_STRLEN(MBREX(search_str)))) { php_error_docref(NULL, E_WARNING, "Position is out of range"); MBREX(search_pos) = 0; diff --git a/ext/mbstring/tests/mb_ereg_search_setpos.phpt b/ext/mbstring/tests/mb_ereg_search_setpos.phpt new file mode 100644 index 0000000000..ec354309f3 --- /dev/null +++ b/ext/mbstring/tests/mb_ereg_search_setpos.phpt @@ -0,0 +1,70 @@ +--TEST-- +mb_ereg_search_setpos() function +--SKIPIF-- + +--FILE-- + +==DONE== +--EXPECTF-- +bool(true) + +Warning: mb_ereg_search_setpos(): Position is out of range in %s on line %d +bool(false) + +* Position: 5 : +bool(true) +int(5) + +* Position: 19 : +bool(true) +int(19) + +* Position: 20 : + +Warning: mb_ereg_search_setpos(): Position is out of range in %s on line %d +bool(false) +int(0) + +* Position: 25 : + +Warning: mb_ereg_search_setpos(): Position is out of range in %s on line %d +bool(false) +int(0) + +* Position: 0 : +bool(true) +int(0) + +* Position: -5 : +bool(true) +int(15) + +* Position: -20 : +bool(true) +int(0) + +* Position: -30 : + +Warning: mb_ereg_search_setpos(): Position is out of range in %s on line %d +bool(false) +int(0) +==DONE== + + -- 2.50.1