2
1
mirror of https://github.com/qpdf/qpdf.git synced 2024-06-03 19:00:51 +00:00

Write offsets as unsigned in linearization hint tables (fixes #1023)

This commit is contained in:
Jay Berkenbilt 2023-10-14 18:03:34 -04:00
parent 9fc02e2f91
commit 71566a2761
3 changed files with 13 additions and 4 deletions

View File

@ -1,5 +1,8 @@
2023-10-14 Jay Berkenbilt <ejb@ql.org> 2023-10-14 Jay Berkenbilt <ejb@ql.org>
* Tweak linearization code to better handle files between 2 GB and
4 GB in size. Fixes #1023.
* Fix serious bug: qpdf could discard a the character after an * Fix serious bug: qpdf could discard a the character after an
escaped octal string. For content, this would only happen with QDF escaped octal string. For content, this would only happen with QDF
or when normalizing content, but it could have happened in a or when normalizing content, but it could have happened in a

View File

@ -1437,6 +1437,12 @@ class QPDF
{ {
return QIntC::to_int(i); return QIntC::to_int(i);
} }
template <typename T>
static unsigned long long
toULL(T const& i)
{
return QIntC::to_ulonglong(i);
}
class Members class Members
{ {

View File

@ -1670,11 +1670,11 @@ QPDF::writeHPageOffset(BitWriter& w)
HPageOffset& t = m->page_offset_hints; HPageOffset& t = m->page_offset_hints;
w.writeBitsInt(t.min_nobjects, 32); // 1 w.writeBitsInt(t.min_nobjects, 32); // 1
w.writeBitsInt(toI(t.first_page_offset), 32); // 2 w.writeBits(toULL(t.first_page_offset), 32); // 2
w.writeBitsInt(t.nbits_delta_nobjects, 16); // 3 w.writeBitsInt(t.nbits_delta_nobjects, 16); // 3
w.writeBitsInt(t.min_page_length, 32); // 4 w.writeBitsInt(t.min_page_length, 32); // 4
w.writeBitsInt(t.nbits_delta_page_length, 16); // 5 w.writeBitsInt(t.nbits_delta_page_length, 16); // 5
w.writeBitsInt(t.min_content_offset, 32); // 6 w.writeBits(toULL(t.min_content_offset), 32); // 6
w.writeBitsInt(t.nbits_delta_content_offset, 16); // 7 w.writeBitsInt(t.nbits_delta_content_offset, 16); // 7
w.writeBitsInt(t.min_content_length, 32); // 8 w.writeBitsInt(t.min_content_length, 32); // 8
w.writeBitsInt(t.nbits_delta_content_length, 16); // 9 w.writeBitsInt(t.nbits_delta_content_length, 16); // 9
@ -1717,7 +1717,7 @@ QPDF::writeHSharedObject(BitWriter& w)
HSharedObject& t = m->shared_object_hints; HSharedObject& t = m->shared_object_hints;
w.writeBitsInt(t.first_shared_obj, 32); // 1 w.writeBitsInt(t.first_shared_obj, 32); // 1
w.writeBitsInt(toI(t.first_shared_offset), 32); // 2 w.writeBits(toULL(t.first_shared_offset), 32); // 2
w.writeBitsInt(t.nshared_first_page, 32); // 3 w.writeBitsInt(t.nshared_first_page, 32); // 3
w.writeBitsInt(t.nshared_total, 32); // 4 w.writeBitsInt(t.nshared_total, 32); // 4
w.writeBitsInt(t.nbits_nobjects, 16); // 5 w.writeBitsInt(t.nbits_nobjects, 16); // 5
@ -1749,7 +1749,7 @@ void
QPDF::writeHGeneric(BitWriter& w, HGeneric& t) QPDF::writeHGeneric(BitWriter& w, HGeneric& t)
{ {
w.writeBitsInt(t.first_object, 32); // 1 w.writeBitsInt(t.first_object, 32); // 1
w.writeBitsInt(toI(t.first_object_offset), 32); // 2 w.writeBits(toULL(t.first_object_offset), 32); // 2
w.writeBitsInt(t.nobjects, 32); // 3 w.writeBitsInt(t.nobjects, 32); // 3
w.writeBitsInt(t.group_length, 32); // 4 w.writeBitsInt(t.group_length, 32); // 4
} }