Skip to content

Commit 4bafba5

Browse files
authored
Check if the non-escaped chars are spaces or printable in "C" locale to match libFuzzer's dictionary parsing. (#178)
1 parent e409c0c commit 4bafba5

2 files changed

Lines changed: 12 additions & 6 deletions

File tree

fuzzing/tools/dict_validation.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,8 +22,8 @@
2222
_DICTIONARY_LINE_RE = re.compile(
2323
r'''[^"]* # Skip an arbitrary prefix (not used by libFuzzer).
2424
" # Must be enclosed in quotes.
25-
(
26-
[^\\] # One or more non-escape characters...
25+
( # A space or printable character in "C" locale except `\`...
26+
((?!\\)[\f\r\t\v\x20-\x7e])
2727
|
2828
\\( # ...or an escape sequence...
2929
[\\\"] # ...consisting of either `\` or `"`...

fuzzing/tools/dict_validation_test.py

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -25,10 +25,16 @@ class DictValidatorTest(unittest.TestCase):
2525

2626
def test_plain_entries(self):
2727
self.assertTrue(validate_line('kw1="blah"'))
28-
self.assertTrue(validate_line('":path"'))
29-
self.assertTrue(validate_line('"keep-alive"'))
30-
self.assertTrue(validate_line('"te"'))
31-
self.assertTrue(validate_line('"ab""'))
28+
self.assertTrue(validate_line('"0123456789"'))
29+
self.assertTrue(validate_line('"abcdefghijklmnopqrstuvwxyz"'))
30+
self.assertTrue(validate_line('"ABCDEFGHIJKLMNOPQRSTUVWXYZ"'))
31+
self.assertTrue(validate_line('"!"#$%&\'()*+,-./:;<=>?@[]^_`{|}~ "'))
32+
self.assertTrue(validate_line('"\t\r\f\v"'))
33+
34+
def test_bad_chars(self):
35+
self.assertFalse(validate_line('"\x07"'))
36+
self.assertFalse(validate_line('"Ā"'))
37+
self.assertFalse(validate_line('"😀"'))
3238

3339
def test_escaped_words(self):
3440
self.assertTrue(validate_line('kw2="\\"ac\\\\dc\\""'))

0 commit comments

Comments
 (0)