summaryrefslogtreecommitdiff
path: root/ext
diff options
context:
space:
mode:
authorNikita Popov <nikita.ppv@gmail.com>2020-04-29 18:42:25 +0200
committerNikita Popov <nikita.ppv@gmail.com>2020-04-29 18:43:09 +0200
commit90705d44e3da1d0aa7b8b4fd921ec597391eccb2 (patch)
treec2afa72a08bf6448bb3c9e3c4187a344ce5402d0 /ext
parentd50a12629d371fbb79dc9a23c290d64f06b29a26 (diff)
downloadphp-git-90705d44e3da1d0aa7b8b4fd921ec597391eccb2.tar.gz
Treat invalid characters in basename() consistently
Always simply ignore (pass through) them. Previously the behavior depended on where the invalid character occurred, as it messed up the state management.
Diffstat (limited to 'ext')
-rw-r--r--ext/standard/string.c10
-rw-r--r--ext/standard/tests/strings/basename_invalid_path.phpt7
2 files changed, 10 insertions, 7 deletions
diff --git a/ext/standard/string.c b/ext/standard/string.c
index 3d2dda4606..a3b743474b 100644
--- a/ext/standard/string.c
+++ b/ext/standard/string.c
@@ -1515,11 +1515,6 @@ PHPAPI zend_string *php_basename(const char *s, size_t len, char *suffix, size_t
int inc_len = (*s == '\0' ? 1 : php_mblen(s, len));
switch (inc_len) {
- case -2:
- case -1:
- inc_len = 1;
- php_mb_reset();
- break;
case 0:
goto quit_loop;
case 1:
@@ -1553,6 +1548,11 @@ PHPAPI zend_string *php_basename(const char *s, size_t len, char *suffix, size_t
}
break;
default:
+ if (inc_len < 0) {
+ /* If character is invalid, treat it like other non-significant characters. */
+ inc_len = 1;
+ php_mb_reset();
+ }
if (state == 0) {
basename_start = s;
state = 1;
diff --git a/ext/standard/tests/strings/basename_invalid_path.phpt b/ext/standard/tests/strings/basename_invalid_path.phpt
index 573f8f014a..7ede6a9473 100644
--- a/ext/standard/tests/strings/basename_invalid_path.phpt
+++ b/ext/standard/tests/strings/basename_invalid_path.phpt
@@ -13,9 +13,12 @@ if((substr(PHP_OS, 0, 3) == "WIN"))
If the filename ends in suffix this will also be cut off.
*/
-var_dump(basename(chr(-1)));
+setlocale(LC_CTYPE, "C");
+var_dump(bin2hex(basename("\xff")));
+var_dump(bin2hex(basename("a\xffb")));
echo "Done\n";
--EXPECT--
-string(0) ""
+string(2) "ff"
+string(6) "61ff62"
Done