diff options
author | Nikita Popov <nikita.ppv@gmail.com> | 2020-04-29 18:42:25 +0200 |
---|---|---|
committer | Nikita Popov <nikita.ppv@gmail.com> | 2020-04-29 18:43:09 +0200 |
commit | 90705d44e3da1d0aa7b8b4fd921ec597391eccb2 (patch) | |
tree | c2afa72a08bf6448bb3c9e3c4187a344ce5402d0 /ext | |
parent | d50a12629d371fbb79dc9a23c290d64f06b29a26 (diff) | |
download | php-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.c | 10 | ||||
-rw-r--r-- | ext/standard/tests/strings/basename_invalid_path.phpt | 7 |
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 |