]> granicus.if.org Git - php/commitdiff
Also check for invalid codepoints in mb_ord()
authorNikita Popov <nikita.ppv@gmail.com>
Fri, 4 Aug 2017 11:00:09 +0000 (13:00 +0200)
committerNikita Popov <nikita.ppv@gmail.com>
Fri, 4 Aug 2017 11:01:03 +0000 (13:01 +0200)
And return false in that case, instead of returning 0x3f...

ext/mbstring/mbstring.c
ext/mbstring/tests/mb_ord.phpt

index 5618d7a75b87c80905a8ca8fc57468a00280c1cc..57e438429d8d1455764aa4d11b3feebfc9a6e32d 100644 (file)
@@ -5074,7 +5074,21 @@ static inline zend_long php_mb_ord(const char* str, size_t str_len, const char*
                return -1;
        }
 
-       ret = php_mb_convert_encoding(str, str_len, "UCS-4BE", enc, &ret_len);
+       {
+               long orig_illegalchars = MBSTRG(illegalchars);
+               MBSTRG(illegalchars) = 0;
+               ret = php_mb_convert_encoding(str, str_len, "UCS-4BE", enc, &ret_len);
+               if (MBSTRG(illegalchars) != 0) {
+                       if (ret) {
+                               efree(ret);
+                       }
+                       MBSTRG(illegalchars) = orig_illegalchars;
+                       return -1;
+               }
+
+               MBSTRG(illegalchars) = orig_illegalchars;
+       }
+
        if (ret == NULL) {
                return -1;
        }
index 4bf0d0c0e49589615acbfd06e899721a8bf77914..25249dae3c9c229a0e5dd0a23a9f4f4536e223fc 100644 (file)
@@ -6,7 +6,7 @@ mb_ord()
 <?php
 var_dump(
     0x20bb7 === mb_ord("\u{20bb7}"),
-    0x3f === mb_ord("\u{d800}"),
+    false === mb_ord("\u{d800}"),
     0x50aa === mb_ord("\x8f\xa1\xef", "EUC-JP-2004")
 );