mirror of
https://github.com/qpdf/qpdf.git
synced 2024-12-22 10:58:58 +00:00
Allow QPDFTokenizer::readToken to return bad tokens
Sometimes we want to ignore bad tokens rather than having them throw an exception. A coverage case is commented out here and added in a later commit.
This commit is contained in:
parent
8320d16cd2
commit
ef8ae5449d
@ -666,7 +666,8 @@ class QPDF
|
||||
size_t recoverStreamLength(
|
||||
PointerHolder<InputSource> input, int objid, int generation,
|
||||
qpdf_offset_t stream_offset);
|
||||
QPDFTokenizer::Token readToken(PointerHolder<InputSource>);
|
||||
QPDFTokenizer::Token readToken(PointerHolder<InputSource>,
|
||||
bool allow_bad = false);
|
||||
|
||||
QPDFObjectHandle readObjectAtOffset(
|
||||
bool attempt_recovery,
|
||||
|
@ -138,7 +138,8 @@ class QPDFTokenizer
|
||||
// exception thrown if there is an error.
|
||||
QPDF_DLL
|
||||
Token readToken(PointerHolder<InputSource> input,
|
||||
std::string const& context);
|
||||
std::string const& context,
|
||||
bool allow_bad = false);
|
||||
|
||||
private:
|
||||
void reset();
|
||||
|
@ -1329,9 +1329,10 @@ QPDF::recoverStreamLength(PointerHolder<InputSource> input,
|
||||
}
|
||||
|
||||
QPDFTokenizer::Token
|
||||
QPDF::readToken(PointerHolder<InputSource> input)
|
||||
QPDF::readToken(PointerHolder<InputSource> input, bool allow_bad)
|
||||
{
|
||||
return this->tokenizer.readToken(input, this->last_object_description);
|
||||
return this->tokenizer.readToken(
|
||||
input, this->last_object_description, allow_bad);
|
||||
}
|
||||
|
||||
QPDFObjectHandle
|
||||
|
@ -475,7 +475,8 @@ QPDFTokenizer::betweenTokens()
|
||||
|
||||
QPDFTokenizer::Token
|
||||
QPDFTokenizer::readToken(PointerHolder<InputSource> input,
|
||||
std::string const& context)
|
||||
std::string const& context,
|
||||
bool allow_bad)
|
||||
{
|
||||
qpdf_offset_t offset = input->tell();
|
||||
Token token;
|
||||
@ -514,13 +515,20 @@ QPDFTokenizer::readToken(PointerHolder<InputSource> input,
|
||||
input->unreadCh(char_to_unread);
|
||||
}
|
||||
|
||||
input->setLastOffset(offset);
|
||||
|
||||
if (token.getType() == tt_bad)
|
||||
{
|
||||
throw QPDFExc(qpdf_e_damaged_pdf, input->getName(),
|
||||
context, offset, token.getErrorMessage());
|
||||
if (allow_bad)
|
||||
{
|
||||
// QTC::TC("qpdf", "QPDFTokenizer allowing bad token");
|
||||
}
|
||||
else
|
||||
{
|
||||
throw QPDFExc(qpdf_e_damaged_pdf, input->getName(),
|
||||
context, offset, token.getErrorMessage());
|
||||
}
|
||||
}
|
||||
|
||||
input->setLastOffset(offset);
|
||||
|
||||
return token;
|
||||
}
|
||||
|
@ -232,7 +232,7 @@ foreach my $d (@bug_tests)
|
||||
show_ntests();
|
||||
# ----------
|
||||
$td->notify("--- Miscellaneous Tests ---");
|
||||
$n_tests += 85;
|
||||
$n_tests += 86;
|
||||
|
||||
$td->runtest("qpdf version",
|
||||
{$td->COMMAND => "qpdf --version"},
|
||||
@ -662,6 +662,13 @@ $td->runtest("combine show and --pages",
|
||||
$td->EXIT_STATUS => 0},
|
||||
$td->NORMALIZE_NEWLINES);
|
||||
|
||||
$td->runtest("ignore bad token",
|
||||
{$td->COMMAND =>
|
||||
"qpdf --show-xref bad-token-startxref.pdf"},
|
||||
{$td->FILE => "bad-token-startxref.out",
|
||||
$td->EXIT_STATUS => 0},
|
||||
$td->NORMALIZE_NEWLINES);
|
||||
|
||||
show_ntests();
|
||||
# ----------
|
||||
$td->notify("--- Single Page ---");
|
||||
|
6
qpdf/qtest/qpdf/bad-token-startxref.out
Normal file
6
qpdf/qtest/qpdf/bad-token-startxref.out
Normal file
@ -0,0 +1,6 @@
|
||||
1/0: uncompressed; offset = 9
|
||||
2/0: uncompressed; offset = 63
|
||||
3/0: uncompressed; offset = 135
|
||||
4/0: uncompressed; offset = 307
|
||||
5/0: uncompressed; offset = 403
|
||||
6/0: uncompressed; offset = 438
|
80
qpdf/qtest/qpdf/bad-token-startxref.pdf
Normal file
80
qpdf/qtest/qpdf/bad-token-startxref.pdf
Normal file
@ -0,0 +1,80 @@
|
||||
%PDF-1.3
|
||||
1 0 obj
|
||||
<<
|
||||
/Type /Catalog
|
||||
/Pages 2 0 R
|
||||
>>
|
||||
endobj
|
||||
|
||||
2 0 obj
|
||||
<<
|
||||
/Type /Pages
|
||||
/Kids [
|
||||
3 0 R
|
||||
]
|
||||
/Count 1
|
||||
>>
|
||||
endobj
|
||||
|
||||
3 0 obj
|
||||
<<
|
||||
/Type /Page
|
||||
/Parent 2 0 R
|
||||
/MediaBox [0 0 612 792]
|
||||
/Contents 4 0 R
|
||||
/Resources <<
|
||||
/ProcSet 5 0 R
|
||||
/Font <<
|
||||
/F1 6 0 R
|
||||
>>
|
||||
>>
|
||||
>>
|
||||
endobj
|
||||
|
||||
4 0 obj
|
||||
<<
|
||||
/Length 44
|
||||
>>
|
||||
stream
|
||||
BT
|
||||
/F1 24 Tf
|
||||
72 720 Td
|
||||
(Potato) Tj
|
||||
ET
|
||||
endstream
|
||||
endobj
|
||||
|
||||
5 0 obj
|
||||
[
|
||||
/PDF
|
||||
/Text
|
||||
]
|
||||
endobj
|
||||
|
||||
6 0 obj
|
||||
<<
|
||||
/Type /Font
|
||||
/Subtype /Type1
|
||||
/Name /F1
|
||||
/BaseFont /Helvetica
|
||||
/Encoding /WinAnsiEncoding
|
||||
>>
|
||||
endobj
|
||||
|
||||
xref
|
||||
0 7
|
||||
0000000000 65535 f
|
||||
0000000009 00000 n
|
||||
0000000063 00000 n
|
||||
0000000135 00000 n
|
||||
0000000307 00000 n
|
||||
0000000403 00000 n
|
||||
0000000438 00000 n
|
||||
trailer <<
|
||||
/Size 7
|
||||
/Root 1 0 R
|
||||
>>
|
||||
startxref(
|
||||
startxref
|
||||
556
|
||||
%%EOF
|
Loading…
Reference in New Issue
Block a user