Commit 3490090fbc7266dfcf7c80c6766d4d557b314292
1 parent
7ae095fa
Detect JSON object whose value is an indirect object
Showing
6 changed files
with
77 additions
and
1 deletions
fuzz/json_fuzzer_seed_corpus/7865f715436bd6c3cdb6b073fcb44b297cb98097
0 โ 100644
fuzz/qtest/fuzz.test
| @@ -16,7 +16,7 @@ my @fuzzers = ( | @@ -16,7 +16,7 @@ my @fuzzers = ( | ||
| 16 | ['dct' => 1], | 16 | ['dct' => 1], |
| 17 | ['flate' => 1], | 17 | ['flate' => 1], |
| 18 | ['hex' => 1], | 18 | ['hex' => 1], |
| 19 | - ['json' => 38], | 19 | + ['json' => 39], |
| 20 | ['lzw' => 2], | 20 | ['lzw' => 2], |
| 21 | ['pngpredictor' => 1], | 21 | ['pngpredictor' => 1], |
| 22 | ['runlength' => 6], | 22 | ['runlength' => 6], |
libqpdf/QPDF_json.cc
| @@ -441,6 +441,10 @@ QPDF::JSONReactor::containerEnd(JSON const& value) | @@ -441,6 +441,10 @@ QPDF::JSONReactor::containerEnd(JSON const& value) | ||
| 441 | void | 441 | void |
| 442 | QPDF::JSONReactor::replaceObject(QPDFObjectHandle&& replacement, JSON const& value) | 442 | QPDF::JSONReactor::replaceObject(QPDFObjectHandle&& replacement, JSON const& value) |
| 443 | { | 443 | { |
| 444 | + if (replacement.isIndirect()) { | ||
| 445 | + error(replacement.getParsedOffset(), "the value of an object may not be an indirect object reference"); | ||
| 446 | + return; | ||
| 447 | + } | ||
| 444 | auto& tos = stack.back(); | 448 | auto& tos = stack.back(); |
| 445 | auto og = tos.object.getObjGen(); | 449 | auto og = tos.object.getObjGen(); |
| 446 | this->pdf.replaceObject(og, replacement); | 450 | this->pdf.replaceObject(og, replacement); |
qpdf/qtest/qpdf-json.test
| @@ -28,6 +28,7 @@ my @badfiles = ( | @@ -28,6 +28,7 @@ my @badfiles = ( | ||
| 28 | 'objects-not-dict', | 28 | 'objects-not-dict', |
| 29 | 'bad-object-key', | 29 | 'bad-object-key', |
| 30 | 'object-not-dict', | 30 | 'object-not-dict', |
| 31 | + 'object-value-indirect', | ||
| 31 | 'stream-not-dict', | 32 | 'stream-not-dict', |
| 32 | 'stream-dict-not-dict', | 33 | 'stream-dict-not-dict', |
| 33 | 'trailer-not-dict', | 34 | 'trailer-not-dict', |
qpdf/qtest/qpdf/qjson-object-value-indirect.json
0 โ 100644
| 1 | +{ | ||
| 2 | + "qpdf": [ | ||
| 3 | + { | ||
| 4 | + "jsonversion": 2, | ||
| 5 | + "pdfversion": "1.3", | ||
| 6 | + "maxobjectid": 6 | ||
| 7 | + }, | ||
| 8 | + { | ||
| 9 | + "obj:1 0 R": { | ||
| 10 | + "value": "2 0 R" | ||
| 11 | + }, | ||
| 12 | + "obj:2 0 R": { | ||
| 13 | + "value": { | ||
| 14 | + "/Count": 1, | ||
| 15 | + "/Kids": [ | ||
| 16 | + "3 0 R" | ||
| 17 | + ], | ||
| 18 | + "/Type": "/Pages" | ||
| 19 | + } | ||
| 20 | + }, | ||
| 21 | + "obj:3 0 R": { | ||
| 22 | + "value": { | ||
| 23 | + "/Contents": "4 0 R", | ||
| 24 | + "/MediaBox": [ | ||
| 25 | + 0, | ||
| 26 | + 0, | ||
| 27 | + 612, | ||
| 28 | + 792 | ||
| 29 | + ], | ||
| 30 | + "/Parent": "2 0 R", | ||
| 31 | + "/Resources": { | ||
| 32 | + "/Font": { | ||
| 33 | + "/F1": "6 0 R" | ||
| 34 | + }, | ||
| 35 | + "/ProcSet": "5 0 R" | ||
| 36 | + }, | ||
| 37 | + "/Type": "/Page" | ||
| 38 | + } | ||
| 39 | + }, | ||
| 40 | + "obj:4 0 R": { | ||
| 41 | + "stream": { | ||
| 42 | + "data": "QlQKICAvRjEgMjQgVGYKICA3MiA3MjAgVGQKICAoUG90YXRvKSBUagpFVAo=", | ||
| 43 | + "dict": {} | ||
| 44 | + } | ||
| 45 | + }, | ||
| 46 | + "obj:5 0 R": { | ||
| 47 | + "value": [ | ||
| 48 | + "/PDF", | ||
| 49 | + "/Text" | ||
| 50 | + ] | ||
| 51 | + }, | ||
| 52 | + "obj:6 0 R": { | ||
| 53 | + "value": { | ||
| 54 | + "/BaseFont": "/Helvetica", | ||
| 55 | + "/Encoding": "/WinAnsiEncoding", | ||
| 56 | + "/Subtype": "/Type1", | ||
| 57 | + "/Type": "/Font" | ||
| 58 | + } | ||
| 59 | + }, | ||
| 60 | + "trailer": { | ||
| 61 | + "value": { | ||
| 62 | + "/Root": "1 0 R", | ||
| 63 | + "/Size": 7 | ||
| 64 | + } | ||
| 65 | + } | ||
| 66 | + } | ||
| 67 | + ] | ||
| 68 | +} |
qpdf/qtest/qpdf/qjson-object-value-indirect.out
0 โ 100644