]> granicus.if.org Git - php/commitdiff
Treat invalid characters in basename() consistently
authorNikita Popov <nikita.ppv@gmail.com>
Wed, 29 Apr 2020 16:42:25 +0000 (18:42 +0200)
committerNikita Popov <nikita.ppv@gmail.com>
Wed, 29 Apr 2020 16:43:09 +0000 (18:43 +0200)
Always simply ignore (pass through) them. Previously the behavior
depended on where the invalid character occurred, as it messed
up the state management.

ext/standard/string.c
ext/standard/tests/strings/basename_invalid_path.phpt

index 3d2dda4606cf6249e915eb937b46e3a46f074948..a3b743474bb252cfbe15ec1d3249107d453b2ced 100644 (file)
@@ -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;
index 573f8f014aec0e3d2224c6783c206409aee4a3a6..7ede6a94733e57b0966aec4844e3a10ea35cb8be 100644 (file)
@@ -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