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\\""'))