2
1
mirror of https://github.com/qpdf/qpdf.git synced 2025-01-03 15:17:29 +00:00
Commit Graph

492 Commits

Author SHA1 Message Date
m-holger
75091093fe
Merge pull request #1280 from m-holger/streams
Tidy QPDF_Stream
2024-09-16 19:52:24 +01:00
m-holger
5d25aac6c7 In QPDFParser constructor change input parameter to InputSource& 2024-09-05 15:30:32 +01:00
m-holger
258343fcc9 In QPDF::readToken change input parameter to InputSource& 2024-09-05 15:23:28 +01:00
m-holger
20edfb3f91 In QPDF::damagedPDF change input parameter to InputSource& 2024-09-05 15:13:30 +01:00
m-holger
83e0f8da88 Tidy QPDF_Stream
1. Make class final
2. Pass og parameter by value
3. Properly initialize qpdf and og

Also, tweak QPDF::replaceObject to allow stream replacement without
violating the requirement that streams must always be indirect objects.

Also, remove QPDF::reserveStream as it does not do what the name implies
and having this as a separate methods does not aid code readability.
2024-09-04 16:00:57 +01:00
m-holger
ef49291682 In QPDF::readObjectAtOffset fail early on 'expect n n obj' 2024-08-23 14:09:20 +01:00
m-holger
c02cb9a720 Fix QPDF::recoverStreamLength
Ensure the the recovered stream end is not part of a different object.

Test file is bad24.pdf with stream 4 'endstream' corrupted.
2024-08-20 15:14:01 +01:00
m-holger
42cd7a98ad In QPDF::recoverStreamLength mark unreachable code 2024-08-20 12:52:33 +01:00
m-holger
f2228b1f88 Fix handling of hybrid reference files in QPDF::read_xrefTable
QPDF::read_xrefTable ignores type 0 entries for objects in a section if an
associates XRefStm has an entry for the same object.

The spec states:

When the conforming reader searches for an object, if an entry is not
found in any given standard cross-reference section, the search shall
proceed to a cross-reference stream specified by the XRefStm entry
before looking in the previous cross-reference section,

If a deleted entry is found in a section, the XRefStm is not searched
according to the standard.
2024-08-16 15:58:55 +01:00
m-holger
06001ed25b Refactor the creation of unresolved objects
Create unresolved objects only for objects in the xref table (except during
parsing of the xref table). Do not add indirect nulls into the the object
cache as the result of a cache miss during a call to getObject except
during parsing or creation/updating from JSON. To support this behaviour,
add new private methods getObjectForParser and getObjectForJSON.

As a result of this change, dangling references are treated as direct nulls
rather than indirect nulls.
2024-08-06 12:22:09 +01:00
m-holger
87ee8ad071 In QPDFParser constructor add add parameter parse_pdf
Prepare for treating indirect references differently depending on whether
we are parsing a PDF file (in which case reference to objects not in the
xref table are null even if they are in the object cache) or whether parse
from user code (in which case an indirect reference can refer to a user
created object).
2024-08-06 10:02:07 +01:00
m-holger
aa4f288291 Refactor xref reconstruction
Avoid unnecessary rescanning of lines and repositioning of input file.
Limit max size of tokens.
2024-07-28 18:03:59 +01:00
m-holger
9ce18e41f4
Merge pull request #979 from m-holger/const
In FUTURE make various QPDFObjectHandle methods const
2024-07-19 10:50:08 +01:00
m-holger
fe1fffe8db Change QPDF max_warnings into a hard limit
Throw damagedFile if max_warnings is exceeded. Change qpdf_fuzzer warnings limit to
limit to 500.
2024-07-18 16:50:08 +01:00
m-holger
186fca6d8d Add further sanity checks to QPDF::reconstruct_xref
Run getAllPages as sanity check and throw an exception if too many
warnings are generated or no pages are found.
2024-07-13 14:51:14 +01:00
m-holger
e914bbbbbc Add further sanity check to QPDF::reconstruct_xref
If reconstruct_xref generates more than 1000 warnings give up because the
file is so severely damaged that there is very little point continuing.
2024-07-11 13:25:07 +01:00
m-holger
2e378d920d Add additional sanity check during xref reconstruction
Check that xref table is not empty after recovery. Empty xref tables
disable other sanity checks.
2024-07-09 17:01:44 +01:00
m-holger
7445e0ac1e Fix QPDF::setSuppressWarnings 2024-07-09 16:38:02 +01:00
m-holger
c1cd3ec8a0 In QPDF::processXRefIndex check number of objects in subsection is > 0
Fixes oss-fuzz 70055
2024-07-06 16:09:50 +01:00
m-holger
f0ded6bca8 Add test case for self-referential object streams
Previous test case was lost in #1221. Test file was created from
object-stream.pdf by adding a reference to itself into object stream 1 0.
2024-07-04 20:40:47 +01:00
Jay Berkenbilt
598268f6ad Add setMaxWarnings rather than using conditional compilation 2024-07-03 15:44:44 +01:00
Jay Berkenbilt
65bd8bc57d Add DCT decompression config methods in favor of compile-time changes
As a rule, we should avoid conditional compilation is it always causes
code paths that are sometimes not even seen lexically by the compiler.
Also, we want the actual code being fuzzed to be as close as possible
to the real code. Conditional compilation is suitable to handle
underlying system differences.

Instead, favor configuration using callbacks or other methods that can
be triggered in the places where they need to be exercised.
2024-07-03 15:43:38 +01:00
m-holger
a367e56afc In QPDF::resolveObjectsInStream avoid creating xref table entries
Invalid entries are created when objects in the stream do not have
an existing xref entry.
2024-07-02 01:16:23 +01:00
m-holger
6d640c569a Add additional object id sanity checks
Ensure objects with impossibly large ids are ignored.
2024-07-02 01:16:23 +01:00
m-holger
42c511198b Suppress excessive warnings while fuzzing
Add extra fuzz test case and amend memory limit for Pl_DCT.
2024-07-02 01:16:23 +01:00
m-holger
8ae3ef28ac Fix #1170
In QPDF::read_xrefEntry add buffer overflow test for first eol character.
Overlong f1 or f2 entries consisting only of zeros could cause a buffer
overflow.

Add fuzz testcase 69913.
2024-06-27 08:17:58 +01:00
m-holger
3d569e2171
Merge pull request #1221 from m-holger/fuzz
Refine handling of severely damaged files
2024-06-27 01:18:37 +01:00
m-holger
4a8c821e3e In QPDF::reconstruct_xref add sanity check for object ids 2024-06-25 15:46:47 +01:00
m-holger
e62973d277 In QPDF check for page tree after reading xref table
Also add new fuzz test case.
2024-06-25 15:18:54 +01:00
m-holger
295f62f041
Merge pull request #1170 from m-holger/readxref
Refactor QPDF::parse_xrefEntry
2024-06-19 20:08:44 +01:00
m-holger
9641626cae Refactor resolving of objects 2024-06-19 10:34:01 +01:00
m-holger
ce5b864c53
Merge pull request #1201 from m-holger/xref_stream
QPDF::processXRefStream
2024-06-18 20:21:39 +01:00
m-holger
2b0c2da720 Refactor QPDF::processXRefStream
Change the processed Index array to a vector of <first object, number of
entries> pairs.
2024-05-22 18:53:30 +01:00
m-holger
7477ea7828 Add new private method QPDF::processXRefSize 2024-05-22 17:07:42 +01:00
m-holger
f74b28f0d1 Add new private method QPDF::processXRefW 2024-05-22 17:07:37 +01:00
m-holger
0186d60dcf Add new private method QPDF::processXRefIndex 2024-05-22 17:07:28 +01:00
m-holger
7aa5027bf8 Refactor QPDF::procesXRefStream
Add closure damaged to create damagedPDF exceptions.
2024-05-22 17:07:16 +01:00
m-holger
1737902a5e Refactor QPDF::processXRefStream
Tune processing of subsections.
2024-05-21 20:31:52 +01:00
m-holger
f1c774f13f Refactor QPDF::processXRefStream
Tune pointer arithmetic.
2024-05-21 20:31:40 +01:00
m-holger
8cd50e0e3e Fix QPDF::tableSize
Apply temporary fix to deal with fuzz case 68915.

(Error is an integer overflow which would immediately cause a runtime error
as a result of a call to QInitCQIntC::to_size.)
2024-05-21 12:50:19 +01:00
m-holger
e85b98b7e8 Guard against object id == std::numeric_limits<int> in QPDF::insertReconstructedXrefEntry 2024-04-30 12:38:02 +01:00
m-holger
972cbf103d In QPDF::processXRefStream avoid inserting objed id 0 into the xref table 2024-04-30 10:38:59 +01:00
m-holger
0df0d00c58 Add method QPDF::Writer::getCompressibleObjSet
Create set without creation of an intermediate vector.
2024-03-08 10:20:12 +00:00
m-holger
ae00ee6119 Replace QPDF::Writer::getObjectStreamData with getXRefTable 2024-03-08 10:10:31 +00:00
m-holger
8791b5f8d0 In QPDFWriter replace map obj_renumber with a new object table obj 2024-03-08 09:36:22 +00:00
m-holger
72bd486337 Refactor QPDF::parse_xrefEntry
Move reading of the entry from read_xrefTable to parse_xrefEntry.

Split parse_xrefEntry into two new methods read_xrefEntry and
read_bad_xrefEntry. read_xrefEntry is optimised for reading
correct entries. To handle incorrect entries it calls read_bad_xrefEntry,
which is largely unchanged from parse_xrefEntry.
2024-03-07 15:33:27 +00:00
Jay Berkenbilt
7caa9ddf5a Format code 2024-02-04 16:12:01 -05:00
m-holger
f0343565ed Tighten checks for invalid indirect references during xref reconstruction 2024-01-17 14:11:57 +00:00
m-holger
6e3b7982db Fix incorrect handling of invalid negative object ids
Fix two errors introduced in #1110 and #1112. Since
#1110, encountering the invalid indirect reference #1110
-2147483648 n R produces an integer underflow which, if
 undetected, immediately trigger a logic error. Since
 #1112, object -1 0 R may be incorrectly identified as
 an earlier generation of itself and deleted,
 invalidating a live iterator.
2024-01-17 10:39:06 +00:00
m-holger
e28625144d Tweak QPDF::getCompressibleObjGens 2024-01-08 10:55:51 -05:00
Jay Berkenbilt
adb866efd3 Fix error from older gcc versions 2024-01-08 10:55:51 -05:00
m-holger
8715d6a693 Tweak QPDF::replaceObject 2024-01-08 11:54:33 +00:00
m-holger
5641832e54 Tweak QPDF::read_xref 2024-01-08 11:43:57 +00:00
Jay Berkenbilt
07f6c635a9 Bug fix: treat old generations of reused objects as null 2024-01-07 17:16:14 -05:00
Jay Berkenbilt
df61f3a6c6 Improve getCompressibleObjGens fix to handle gen > 0 2024-01-07 15:22:04 -05:00
m-holger
ba477e0b33 Tune QPDF::getCompressibleObjGens
Change set visited to std::vector<bool>
2024-01-07 17:39:40 +00:00
m-holger
6195499598 Tune QPDF::getCompressibleObjGens
Swap front and back, and change queue from list to vector
2024-01-07 16:39:03 +00:00
Jay Berkenbilt
55b0024899 Format code 2024-01-06 17:23:45 -05:00
Jay Berkenbilt
7b3fff15a9 QPDF.cc: remove unused includes 2024-01-06 17:19:16 -05:00
Jay Berkenbilt
2994f9cf4c Attempt to find xref streams during recovery (fixes #1103) 2024-01-06 16:51:03 -05:00
Jay Berkenbilt
7c0fdf8510 Format code, bump clang-format version to 18 2023-12-22 21:45:10 -05:00
m-holger
ddad5ad53e In QPDF::pipeStreamData use unique_ptr as heap 2023-11-26 13:06:12 +00:00
m-holger
0dee397075 In QPDF::pipeStreamData read buffer in a single read 2023-11-26 12:26:57 +00:00
Jay Berkenbilt
98014ec98a Fix error with stream recovery (fixes #1042) 2023-10-07 13:29:10 -04:00
m-holger
fb504ce913 Fix #1028 2023-09-05 17:22:34 +01:00
Jay Berkenbilt
bfbd97b938 Spell check 2023-09-03 14:07:30 -04:00
m-holger
b0c3ea2bb6 Refactor test for /Pages object in QPDF::copyForeignObject
Test for missing object before accessing obj_copier.object_map.
2023-09-03 13:41:11 +01:00
m-holger
ac32dbc313 Reserve foreign /Page objects in QPDF::copyForeignObject
Ensure that links to foreign pages are not broken provided that the page is
subsequently copied.
2023-08-25 14:06:42 +01:00
m-holger
ad73bbcd90 Change QPDF::reserveObjects to reserve indirect nulls to reserve foreign objects 2023-08-25 13:30:55 +01:00
m-holger
52539544c4 Modify QPDF::replaceReserved to allow replacing indirect nulls 2023-08-25 12:37:24 +01:00
m-holger
fedd42191f Change QPDF::copyForeignObject to return a null object when called with a /Pages object (fixes #1011) 2023-08-25 12:10:51 +01:00
Jay Berkenbilt
3f9b5053ba Format code 2023-07-09 09:59:55 -04:00
m-holger
ba3953f1bf Tune QPDF::readObject 2023-07-08 16:32:07 +01:00
m-holger
5754ab8b39 Tune QPDF::readObjectInStream 2023-07-08 16:32:00 +01:00
m-holger
aabd3f6f9b Add private method QPDF::validateStreamLineEnd 2023-07-08 16:31:57 +01:00
m-holger
ef866d68cd In QPDF::readStream remove variable done 2023-07-08 16:31:50 +01:00
m-holger
c422b918b1 Add new private method QPDF::readStream 2023-07-08 16:31:44 +01:00
m-holger
2643ed4dd9 Add new private method QPDF::readTrailer() 2023-07-08 01:28:15 +01:00
m-holger
bee726609c Remove redundant parameters from QPDF::readObject 2023-07-07 20:37:13 +01:00
m-holger
2bf7359e35 Add new private method QPDF::readObjectInStream 2023-07-07 20:14:59 +01:00
m-holger
098b98c889 Tidy QPDF::read_xrefTable(qpdf_offset_t xref_offset) 2023-07-04 19:59:09 +01:00
m-holger
8e6974710c Add private method QPDF::insertFreeXrefEntry 2023-07-04 19:59:09 +01:00
m-holger
250a736482 Remove parameter overwrite from QPDF::processXRefStream 2023-07-04 19:59:09 +01:00
m-holger
769a4915e8 Add new private method QPDF::insertReconstructedXrefEntry 2023-07-04 19:59:09 +01:00
Jay Berkenbilt
071fe4a0e5
Merge pull request #985 from m-holger/members
Change JSONHandler::m to std::unique_ptr and declare Members in implementation file
2023-06-17 11:57:02 -04:00
Jay Berkenbilt
0b538ec877
Merge pull request #982 from m-holger/cltidy
Apply various Clang-Tidy rules
2023-06-17 11:29:21 -04:00
Jay Berkenbilt
d3c444a7fb
Merge pull request #980 from m-holger/readobject
Avoid unnecessary copying of stream dictionary in QPDF::readObject
2023-06-17 10:54:45 -04:00
m-holger
8b05c550b3 Fix doc typos 2023-06-17 14:38:20 +01:00
m-holger
7bc0f1d828 Code tidy - Clang-Tidy rule modernize-use-emplace 2023-06-09 15:42:11 +01:00
m-holger
320bbb9854 Code tidy - Clang-Tidy rule modernize-return-braced-init-list 2023-06-09 15:35:56 +01:00
m-holger
4490d4c35e Avoid unnecessary copying of stream dictionary in QPDF::readObject 2023-06-05 21:22:40 +01:00
m-holger
3c5700c255 Code tidy - reflow comments and strings 2023-06-02 16:00:40 +01:00
m-holger
698a70e6a8 Code tidy - reflow comments and strings 2023-05-27 10:54:19 +01:00
Jay Berkenbilt
60965d5f4d Rerun clang-format 2023-05-21 13:35:09 -04:00
m-holger
49e6365f63 Replace 'this->m' with 'm'
Manual edits for cases not handled by search and replace
2023-05-21 14:52:24 +01:00
m-holger
85d784952f Globally replace 'this->m->' with 'm->'
Using search and replace.
2023-05-21 14:42:34 +01:00
m-holger
05a49cecf1 Add new method QPDF::newReserved 2023-05-20 19:56:01 +01:00
Jay Berkenbilt
a85635b839
Merge pull request #929 from m-holger/ogguard
Add new convenience class QPDFObjGen::Guard
2023-05-20 14:09:49 -04:00
m-holger
e6577a1323 Replace 'virtual' specifier with 'override' 2023-05-20 15:41:56 +01:00
m-holger
ba5a3567a2 Remove redundant 'virtual' specifiers 2023-05-20 15:41:52 +01:00