mirror of
https://github.com/qpdf/qpdf.git
synced 2025-01-02 22:50:20 +00:00
Test for direct, rather than resolved nulls in parser
Just because we know an indirect reference is null, doesn't mean we shouldn't keep it indirect.
This commit is contained in:
parent
3f3dbe22ea
commit
4b2e72c4cd
@ -1,5 +1,9 @@
|
|||||||
2019-08-22 Jay Berkenbilt <ejb@ql.org>
|
2019-08-22 Jay Berkenbilt <ejb@ql.org>
|
||||||
|
|
||||||
|
* Add QPDFObjectHandle::isDirectNull() -- a const method that
|
||||||
|
allows determining whether an object is a literal null without
|
||||||
|
attempting to resolve it.
|
||||||
|
|
||||||
* Stop replacing indirect references to null with literal null in
|
* Stop replacing indirect references to null with literal null in
|
||||||
arrays when writing output with QPDFWriter.
|
arrays when writing output with QPDFWriter.
|
||||||
|
|
||||||
|
@ -281,13 +281,12 @@ class QPDFObjectHandle
|
|||||||
QPDF_DLL
|
QPDF_DLL
|
||||||
bool isReserved();
|
bool isReserved();
|
||||||
|
|
||||||
// True for objects that are direct nulls or have previously been
|
// True for objects that are direct nulls. Does not attempt to
|
||||||
// resolved to be nulls. Does not attempt to resolve objects. This
|
// resolve objects. This is intended for internal use, but it can
|
||||||
// is intended for internal use, but it can be used as an
|
// be used as an efficient way to check for nulls that are not
|
||||||
// efficient way to check for nulls if you don't mind unresolved
|
// indirect objects.
|
||||||
// indirect nulls being false negatives.
|
|
||||||
QPDF_DLL
|
QPDF_DLL
|
||||||
bool isResolvedNull() const;
|
bool isDirectNull() const;
|
||||||
|
|
||||||
// This returns true in addition to the query for the specific
|
// This returns true in addition to the query for the specific
|
||||||
// type for indirect objects.
|
// type for indirect objects.
|
||||||
|
@ -263,9 +263,10 @@ QPDFObjectHandle::isBool()
|
|||||||
}
|
}
|
||||||
|
|
||||||
bool
|
bool
|
||||||
QPDFObjectHandle::isResolvedNull() const
|
QPDFObjectHandle::isDirectNull() const
|
||||||
{
|
{
|
||||||
return QPDFObjectTypeAccessor<QPDF_Null>::check(m->obj.getPointer());
|
return (this->m->initialized && (this->m->objid == 0) &&
|
||||||
|
QPDFObjectTypeAccessor<QPDF_Null>::check(m->obj.getPointer()));
|
||||||
}
|
}
|
||||||
|
|
||||||
bool
|
bool
|
||||||
|
@ -15,7 +15,7 @@ SparseOHArray::size() const
|
|||||||
void
|
void
|
||||||
SparseOHArray::append(QPDFObjectHandle oh)
|
SparseOHArray::append(QPDFObjectHandle oh)
|
||||||
{
|
{
|
||||||
if (! oh.isResolvedNull())
|
if (! oh.isDirectNull())
|
||||||
{
|
{
|
||||||
this->elements[this->n_elements] = oh;
|
this->elements[this->n_elements] = oh;
|
||||||
}
|
}
|
||||||
@ -73,7 +73,7 @@ SparseOHArray::setAt(size_t idx, QPDFObjectHandle oh)
|
|||||||
{
|
{
|
||||||
throw std::logic_error("bounds error setting item in SparseOHArray");
|
throw std::logic_error("bounds error setting item in SparseOHArray");
|
||||||
}
|
}
|
||||||
if (oh.isResolvedNull())
|
if (oh.isDirectNull())
|
||||||
{
|
{
|
||||||
this->elements.erase(idx);
|
this->elements.erase(idx);
|
||||||
}
|
}
|
||||||
|
@ -2456,6 +2456,7 @@ my @goodfiles = ("implicit null", # 1
|
|||||||
"hybrid xref old mode", # 18
|
"hybrid xref old mode", # 18
|
||||||
"xref with prev", # 19
|
"xref with prev", # 19
|
||||||
"lots of compressible objects", # 20
|
"lots of compressible objects", # 20
|
||||||
|
"array with indirect nulls", # 21
|
||||||
);
|
);
|
||||||
|
|
||||||
$n_tests += (3 * @goodfiles) + 6;
|
$n_tests += (3 * @goodfiles) + 6;
|
||||||
|
11
qpdf/qtest/qpdf/good21.out
Normal file
11
qpdf/qtest/qpdf/good21.out
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
/QTest is indirect and has type array (8)
|
||||||
|
/QTest is an array with 6 items
|
||||||
|
item 0 is direct
|
||||||
|
item 1 is direct
|
||||||
|
item 2 is direct
|
||||||
|
item 3 is indirect
|
||||||
|
item 4 is direct
|
||||||
|
item 5 is indirect
|
||||||
|
unparse: 9 0 R
|
||||||
|
unparseResolved: [ /literal null /indirect 8 0 R /undefined 10 0 R ]
|
||||||
|
test 1 done
|
106
qpdf/qtest/qpdf/good21.pdf
Normal file
106
qpdf/qtest/qpdf/good21.pdf
Normal file
@ -0,0 +1,106 @@
|
|||||||
|
%PDF-1.3
|
||||||
|
%¿÷¢þ
|
||||||
|
%QDF-1.0
|
||||||
|
|
||||||
|
1 0 obj
|
||||||
|
<<
|
||||||
|
/Pages 2 0 R
|
||||||
|
/Type /Catalog
|
||||||
|
>>
|
||||||
|
endobj
|
||||||
|
|
||||||
|
2 0 obj
|
||||||
|
<<
|
||||||
|
/Count 1
|
||||||
|
/Kids [
|
||||||
|
3 0 R
|
||||||
|
]
|
||||||
|
/Type /Pages
|
||||||
|
>>
|
||||||
|
endobj
|
||||||
|
|
||||||
|
%% Page 1
|
||||||
|
3 0 obj
|
||||||
|
<<
|
||||||
|
/Contents 4 0 R
|
||||||
|
/MediaBox [
|
||||||
|
0
|
||||||
|
0
|
||||||
|
612
|
||||||
|
792
|
||||||
|
]
|
||||||
|
/Parent 2 0 R
|
||||||
|
/Resources <<
|
||||||
|
/Font <<
|
||||||
|
/F1 6 0 R
|
||||||
|
>>
|
||||||
|
/ProcSet 7 0 R
|
||||||
|
>>
|
||||||
|
/Type /Page
|
||||||
|
>>
|
||||||
|
endobj
|
||||||
|
|
||||||
|
%% Contents for page 1
|
||||||
|
4 0 obj
|
||||||
|
<<
|
||||||
|
/Length 5 0 R
|
||||||
|
>>
|
||||||
|
stream
|
||||||
|
BT
|
||||||
|
/F1 24 Tf
|
||||||
|
72 720 Td
|
||||||
|
(Potato) Tj
|
||||||
|
ET
|
||||||
|
endstream
|
||||||
|
endobj
|
||||||
|
|
||||||
|
5 0 obj
|
||||||
|
44
|
||||||
|
endobj
|
||||||
|
|
||||||
|
6 0 obj
|
||||||
|
<<
|
||||||
|
/BaseFont /Helvetica
|
||||||
|
/Encoding /WinAnsiEncoding
|
||||||
|
/Name /F1
|
||||||
|
/Subtype /Type1
|
||||||
|
/Type /Font
|
||||||
|
>>
|
||||||
|
endobj
|
||||||
|
|
||||||
|
7 0 obj
|
||||||
|
[
|
||||||
|
/PDF
|
||||||
|
/Text
|
||||||
|
]
|
||||||
|
endobj
|
||||||
|
|
||||||
|
8 0 obj
|
||||||
|
null
|
||||||
|
endobj
|
||||||
|
|
||||||
|
9 0 obj
|
||||||
|
[ /literal null /indirect 8 0 R /undefined 10 0 R ]
|
||||||
|
endobj
|
||||||
|
|
||||||
|
xref
|
||||||
|
0 10
|
||||||
|
0000000000 65535 f
|
||||||
|
0000000025 00000 n
|
||||||
|
0000000079 00000 n
|
||||||
|
0000000161 00000 n
|
||||||
|
0000000376 00000 n
|
||||||
|
0000000475 00000 n
|
||||||
|
0000000494 00000 n
|
||||||
|
0000000612 00000 n
|
||||||
|
0000000647 00000 n
|
||||||
|
0000000668 00000 n
|
||||||
|
trailer <<
|
||||||
|
/Root 1 0 R
|
||||||
|
/Size 10
|
||||||
|
/QTest 9 0 R
|
||||||
|
/ID [<06c2c8fc54c5f9cc9246898e1e1a7146><06c2c8fc54c5f9cc9246898e1e1a7146>]
|
||||||
|
>>
|
||||||
|
startxref
|
||||||
|
736
|
||||||
|
%%EOF
|
127
qpdf/qtest/qpdf/good21.qdf
Normal file
127
qpdf/qtest/qpdf/good21.qdf
Normal file
@ -0,0 +1,127 @@
|
|||||||
|
%PDF-1.3
|
||||||
|
%¿÷¢þ
|
||||||
|
%QDF-1.0
|
||||||
|
|
||||||
|
%% Original object ID: 1 0
|
||||||
|
1 0 obj
|
||||||
|
<<
|
||||||
|
/Pages 3 0 R
|
||||||
|
/Type /Catalog
|
||||||
|
>>
|
||||||
|
endobj
|
||||||
|
|
||||||
|
%% Original object ID: 9 0
|
||||||
|
2 0 obj
|
||||||
|
[
|
||||||
|
/literal
|
||||||
|
null
|
||||||
|
/indirect
|
||||||
|
4 0 R
|
||||||
|
/undefined
|
||||||
|
5 0 R
|
||||||
|
]
|
||||||
|
endobj
|
||||||
|
|
||||||
|
%% Original object ID: 2 0
|
||||||
|
3 0 obj
|
||||||
|
<<
|
||||||
|
/Count 1
|
||||||
|
/Kids [
|
||||||
|
6 0 R
|
||||||
|
]
|
||||||
|
/Type /Pages
|
||||||
|
>>
|
||||||
|
endobj
|
||||||
|
|
||||||
|
%% Original object ID: 8 0
|
||||||
|
4 0 obj
|
||||||
|
null
|
||||||
|
endobj
|
||||||
|
|
||||||
|
%% Original object ID: 10 0
|
||||||
|
5 0 obj
|
||||||
|
null
|
||||||
|
endobj
|
||||||
|
|
||||||
|
%% Page 1
|
||||||
|
%% Original object ID: 3 0
|
||||||
|
6 0 obj
|
||||||
|
<<
|
||||||
|
/Contents 7 0 R
|
||||||
|
/MediaBox [
|
||||||
|
0
|
||||||
|
0
|
||||||
|
612
|
||||||
|
792
|
||||||
|
]
|
||||||
|
/Parent 3 0 R
|
||||||
|
/Resources <<
|
||||||
|
/Font <<
|
||||||
|
/F1 9 0 R
|
||||||
|
>>
|
||||||
|
/ProcSet 10 0 R
|
||||||
|
>>
|
||||||
|
/Type /Page
|
||||||
|
>>
|
||||||
|
endobj
|
||||||
|
|
||||||
|
%% Contents for page 1
|
||||||
|
%% Original object ID: 4 0
|
||||||
|
7 0 obj
|
||||||
|
<<
|
||||||
|
/Length 8 0 R
|
||||||
|
>>
|
||||||
|
stream
|
||||||
|
BT
|
||||||
|
/F1 24 Tf
|
||||||
|
72 720 Td
|
||||||
|
(Potato) Tj
|
||||||
|
ET
|
||||||
|
endstream
|
||||||
|
endobj
|
||||||
|
|
||||||
|
8 0 obj
|
||||||
|
44
|
||||||
|
endobj
|
||||||
|
|
||||||
|
%% Original object ID: 6 0
|
||||||
|
9 0 obj
|
||||||
|
<<
|
||||||
|
/BaseFont /Helvetica
|
||||||
|
/Encoding /WinAnsiEncoding
|
||||||
|
/Name /F1
|
||||||
|
/Subtype /Type1
|
||||||
|
/Type /Font
|
||||||
|
>>
|
||||||
|
endobj
|
||||||
|
|
||||||
|
%% Original object ID: 7 0
|
||||||
|
10 0 obj
|
||||||
|
[
|
||||||
|
/PDF
|
||||||
|
/Text
|
||||||
|
]
|
||||||
|
endobj
|
||||||
|
|
||||||
|
xref
|
||||||
|
0 11
|
||||||
|
0000000000 65535 f
|
||||||
|
0000000052 00000 n
|
||||||
|
0000000133 00000 n
|
||||||
|
0000000239 00000 n
|
||||||
|
0000000338 00000 n
|
||||||
|
0000000387 00000 n
|
||||||
|
0000000445 00000 n
|
||||||
|
0000000688 00000 n
|
||||||
|
0000000787 00000 n
|
||||||
|
0000000833 00000 n
|
||||||
|
0000000978 00000 n
|
||||||
|
trailer <<
|
||||||
|
/QTest 2 0 R
|
||||||
|
/Root 1 0 R
|
||||||
|
/Size 11
|
||||||
|
/ID [<06c2c8fc54c5f9cc9246898e1e1a7146><31415926535897932384626433832795>]
|
||||||
|
>>
|
||||||
|
startxref
|
||||||
|
1014
|
||||||
|
%%EOF
|
Loading…
Reference in New Issue
Block a user