Check if the non-escaped chars are spaces or printable in "C" locale to match libFuzzer's dictionary parsing. (#178)
diff --git a/fuzzing/tools/dict_validation.py b/fuzzing/tools/dict_validation.py index d47bbc2..ff304a4 100644 --- a/fuzzing/tools/dict_validation.py +++ b/fuzzing/tools/dict_validation.py
@@ -22,8 +22,8 @@ _DICTIONARY_LINE_RE = re.compile( r'''[^"]* # Skip an arbitrary prefix (not used by libFuzzer). " # Must be enclosed in quotes. - ( - [^\\] # One or more non-escape characters... + ( # A space or printable character in "C" locale except `\`... + ((?!\\)[\f\r\t\v\x20-\x7e]) | \\( # ...or an escape sequence... [\\\"] # ...consisting of either `\` or `"`...
diff --git a/fuzzing/tools/dict_validation_test.py b/fuzzing/tools/dict_validation_test.py index 322520d..513f803 100644 --- a/fuzzing/tools/dict_validation_test.py +++ b/fuzzing/tools/dict_validation_test.py
@@ -25,10 +25,16 @@ def test_plain_entries(self): self.assertTrue(validate_line('kw1="blah"')) - self.assertTrue(validate_line('":path"')) - self.assertTrue(validate_line('"keep-alive"')) - self.assertTrue(validate_line('"te"')) - self.assertTrue(validate_line('"ab""')) + self.assertTrue(validate_line('"0123456789"')) + self.assertTrue(validate_line('"abcdefghijklmnopqrstuvwxyz"')) + self.assertTrue(validate_line('"ABCDEFGHIJKLMNOPQRSTUVWXYZ"')) + self.assertTrue(validate_line('"!"#$%&\'()*+,-./:;<=>?@[]^_`{|}~ "')) + self.assertTrue(validate_line('"\t\r\f\v"')) + + def test_bad_chars(self): + self.assertFalse(validate_line('"\x07"')) + self.assertFalse(validate_line('"Ā"')) + self.assertFalse(validate_line('"😀"')) def test_escaped_words(self): self.assertTrue(validate_line('kw2="\\"ac\\\\dc\\""'))