]> git.ipfire.org Git - thirdparty/vala.git/commitdiff
genie: Add support for the \uXXXX escape sequence
authorEvgeny Bobkin <evgen.ibqn@gmail.com>
Wed, 16 May 2018 12:15:07 +0000 (14:15 +0200)
committerRico Tzschichholz <ricotz@ubuntu.com>
Mon, 21 May 2018 19:15:26 +0000 (21:15 +0200)
An additional checks to validate the escape sequences \xYY and \uYYYY
were added, where Y represents a hex digit.

Ported from 04422d716cf226b5e8a6c11306e07adbde26fd67

vala/valageniescanner.vala

index 894ab387d4a46784bff2a6d1e20fd515533dc3f7..d46a767caa41c1034b657814a3c3c560c87b2901 100644 (file)
@@ -230,14 +230,31 @@ public class Vala.Genie.Scanner {
                                                        current++;
                                                        token_length_in_chars++;
                                                        break;
+                                               case 'u':
+                                                       // u escape character has four hex digits
+                                                       current++;
+                                                       token_length_in_chars++;
+                                                       int digit_length;
+                                                       for (digit_length = 0; digit_length < 4 && current < end && current[0].isxdigit (); digit_length++) {
+                                                               current++;
+                                                               token_length_in_chars++;
+                                                       }
+                                                       if (digit_length != 4) {
+                                                               Report.error (get_source_reference (token_length_in_chars), "\\u requires four hex digits");
+                                                       }
+                                                       break;
                                                case 'x':
-                                                       // hexadecimal escape character
+                                                       // hexadecimal escape character requires two hex digits
                                                        current++;
                                                        token_length_in_chars++;
-                                                       while (current < end && current[0].isxdigit ()) {
+                                                       int digit_length;
+                                                       for (digit_length = 0; digit_length < 2 && current < end && current[0].isxdigit (); digit_length++) {
                                                                current++;
                                                                token_length_in_chars++;
                                                        }
+                                                       if (digit_length != 2) {
+                                                               Report.error (get_source_reference (token_length_in_chars), "\\x requires two hex digits");
+                                                       }
                                                        break;
                                                default:
                                                        // back references \1 through \99
@@ -739,14 +756,31 @@ public class Vala.Genie.Scanner {
                                                        current++;
                                                        token_length_in_chars++;
                                                        break;
+                                               case 'u':
+                                                       // u escape character has four hex digits
+                                                       current++;
+                                                       token_length_in_chars++;
+                                                       int digit_length;
+                                                       for (digit_length = 0; digit_length < 4 && current < end && current[0].isxdigit (); digit_length++) {
+                                                               current++;
+                                                               token_length_in_chars++;
+                                                       }
+                                                       if (digit_length != 4) {
+                                                               Report.error (get_source_reference (token_length_in_chars), "\\u requires four hex digits");
+                                                       }
+                                                       break;
                                                case 'x':
-                                                       // hexadecimal escape character
+                                                       // hexadecimal escape character requires two hex digits
                                                        current++;
                                                        token_length_in_chars++;
-                                                       while (current < end && current[0].isxdigit ()) {
+                                                       int digit_length;
+                                                       for (digit_length = 0; digit_length < 2 && current < end && current[0].isxdigit (); digit_length++) {
                                                                current++;
                                                                token_length_in_chars++;
                                                        }
+                                                       if (digit_length != 2) {
+                                                               Report.error (get_source_reference (token_length_in_chars), "\\x requires two hex digits");
+                                                       }
                                                        break;
                                                default:
                                                        Report.error (get_source_reference (token_length_in_chars), "invalid escape sequence");
@@ -1295,14 +1329,31 @@ public class Vala.Genie.Scanner {
                                                        current++;
                                                        token_length_in_chars++;
                                                        break;
+                                               case 'u':
+                                                       // u escape character has four hex digits
+                                                       current++;
+                                                       token_length_in_chars++;
+                                                       int digit_length;
+                                                       for (digit_length = 0; digit_length < 4 && current < end && current[0].isxdigit (); digit_length++) {
+                                                               current++;
+                                                               token_length_in_chars++;
+                                                       }
+                                                       if (digit_length != 4) {
+                                                               Report.error (get_source_reference (token_length_in_chars), "\\u requires four hex digits");
+                                                       }
+                                                       break;
                                                case 'x':
-                                                       // hexadecimal escape character
+                                                       // hexadecimal escape character requires two hex digits
                                                        current++;
                                                        token_length_in_chars++;
-                                                       while (current < end && current[0].isxdigit ()) {
+                                                       int digit_length;
+                                                       for (digit_length = 0; digit_length < 2 && current < end && current[0].isxdigit (); digit_length++) {
                                                                current++;
                                                                token_length_in_chars++;
                                                        }
+                                                       if (digit_length != 2) {
+                                                               Report.error (get_source_reference (token_length_in_chars), "\\x requires two hex digits");
+                                                       }
                                                        break;
                                                default:
                                                        Report.error (get_source_reference (token_length_in_chars), "invalid escape sequence");