mirror of
https://github.com/qpdf/qpdf.git
synced 2024-12-31 14:01:59 +00:00
fix-qdf: handle object streams with > 255 objects
fix-qdf was previously hard-coding the number of bytes for the f2 field of the xref stream entry. This addresses issue #37. Thanks aluebcke for reporting.
This commit is contained in:
parent
cf43882e9f
commit
b356b9dfa2
@ -1,5 +1,8 @@
|
|||||||
2015-05-24 Jay Berkenbilt <ejb@ql.org>
|
2015-05-24 Jay Berkenbilt <ejb@ql.org>
|
||||||
|
|
||||||
|
* Bug fix: fix-qdf was not handling object streams with more than
|
||||||
|
255 objects in them.
|
||||||
|
|
||||||
* Handle Microsoft crypt provider initialization properly for case
|
* Handle Microsoft crypt provider initialization properly for case
|
||||||
where no keys have been previously created, such as in a fresh
|
where no keys have been previously created, such as in a fresh
|
||||||
Windows installation.
|
Windows installation.
|
||||||
|
44
qpdf/fix-qdf
44
qpdf/fix-qdf
@ -53,6 +53,7 @@ my $stream_start = 0;
|
|||||||
my $stream_length = 0;
|
my $stream_length = 0;
|
||||||
my $xref_offset = 0;
|
my $xref_offset = 0;
|
||||||
my $xref_f1_nbytes = 0;
|
my $xref_f1_nbytes = 0;
|
||||||
|
my $xref_f2_nbytes = 0;
|
||||||
my $xref_size = 0;
|
my $xref_size = 0;
|
||||||
|
|
||||||
my $cur_state = 0;
|
my $cur_state = 0;
|
||||||
@ -122,11 +123,28 @@ while (defined($line = get_line()))
|
|||||||
$t >>= 8;
|
$t >>= 8;
|
||||||
++$xref_f1_nbytes;
|
++$xref_f1_nbytes;
|
||||||
}
|
}
|
||||||
my $esize = $xref_f1_nbytes + 2;
|
# Figure out how many bytes we need for ostream index.
|
||||||
|
# Make sure we get at least 1 byte even if there are no
|
||||||
|
# object streams.
|
||||||
|
my $max_objects = 1;
|
||||||
|
foreach my $e (@xref)
|
||||||
|
{
|
||||||
|
my ($type, $f1, $f2) = @$e;
|
||||||
|
if ((defined $f2) && ($f2 > $max_objects))
|
||||||
|
{
|
||||||
|
$max_objects = $f2;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
while ($max_objects)
|
||||||
|
{
|
||||||
|
$max_objects >>=8;
|
||||||
|
++$xref_f2_nbytes;
|
||||||
|
}
|
||||||
|
my $esize = 1 + $xref_f1_nbytes + $xref_f2_nbytes;
|
||||||
$xref_size = 1 + @xref;
|
$xref_size = 1 + @xref;
|
||||||
my $length = $xref_size * $esize;
|
my $length = $xref_size * $esize;
|
||||||
print " /Length $length\n";
|
print " /Length $length\n";
|
||||||
print " /W [ 1 $xref_f1_nbytes 1 ]\n";
|
print " /W [ 1 $xref_f1_nbytes $xref_f2_nbytes ]\n";
|
||||||
$state = $st_in_xref_stream_dict;
|
$state = $st_in_xref_stream_dict;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -200,19 +218,25 @@ while (defined($line = get_line()))
|
|||||||
}
|
}
|
||||||
if ($line =~ m/^stream\n/)
|
if ($line =~ m/^stream\n/)
|
||||||
{
|
{
|
||||||
my $pack = "(C C$xref_f1_nbytes C)";
|
my $pack = "(C C$xref_f1_nbytes C$xref_f2_nbytes)";
|
||||||
print pack($pack, 0, 0, 0);
|
print pack($pack, 0, 0, 0);
|
||||||
foreach my $x (@xref)
|
foreach my $x (@xref)
|
||||||
{
|
{
|
||||||
my ($type, $f1, $f2) = @$x;
|
my ($type, $f1, $f2) = @$x;
|
||||||
$f2 = 0 unless defined $f2;
|
$f2 = 0 unless defined $f2;
|
||||||
my @f1 = ();
|
my @f1 = ();
|
||||||
for (my $i = 0; $i < $xref_f1_nbytes; ++$i)
|
my @f2 = ();
|
||||||
{
|
foreach my $d ([\@f1, $f1, $xref_f1_nbytes],
|
||||||
unshift(@f1, $f1 & 0xff);
|
[\@f2, $f2, $xref_f2_nbytes])
|
||||||
$f1 >>= 8;
|
{
|
||||||
}
|
my ($fa, $f, $nbytes) = @$d;
|
||||||
print pack($pack, $type, @f1, $f2);
|
for (my $i = 0; $i < $nbytes; ++$i)
|
||||||
|
{
|
||||||
|
unshift(@$fa, $f & 0xff);
|
||||||
|
$f >>= 8;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
print pack($pack, $type, @f1, @f2);
|
||||||
}
|
}
|
||||||
print "\nendstream\nendobj\n\n";
|
print "\nendstream\nendobj\n\n";
|
||||||
print "startxref\n$xref_offset\n\%\%EOF\n";
|
print "startxref\n$xref_offset\n\%\%EOF\n";
|
||||||
|
@ -1993,7 +1993,7 @@ compare_pdfs("inline-images-cr.pdf", "a.pdf");
|
|||||||
show_ntests();
|
show_ntests();
|
||||||
# ----------
|
# ----------
|
||||||
$td->notify("--- fix-qdf Tests ---");
|
$td->notify("--- fix-qdf Tests ---");
|
||||||
$n_tests += 4;
|
$n_tests += 5;
|
||||||
|
|
||||||
for (my $n = 1; $n <= 2; ++$n)
|
for (my $n = 1; $n <= 2; ++$n)
|
||||||
{
|
{
|
||||||
@ -2007,6 +2007,10 @@ for (my $n = 1; $n <= 2; ++$n)
|
|||||||
{$td->FILE => "fix$n.qdf.out",
|
{$td->FILE => "fix$n.qdf.out",
|
||||||
$td->EXIT_STATUS => 0});
|
$td->EXIT_STATUS => 0});
|
||||||
}
|
}
|
||||||
|
$td->runtest("fix-qdf with big object stream", # > 255 objects in a stream
|
||||||
|
{$td->COMMAND => "fix-qdf big-ostream.pdf"},
|
||||||
|
{$td->FILE => "big-ostream.pdf",
|
||||||
|
$td->EXIT_STATUS => 0});
|
||||||
|
|
||||||
show_ntests();
|
show_ntests();
|
||||||
# ----------
|
# ----------
|
||||||
|
2207
qpdf/qtest/qpdf/big-ostream.pdf
Normal file
2207
qpdf/qtest/qpdf/big-ostream.pdf
Normal file
File diff suppressed because it is too large
Load Diff
Loading…
Reference in New Issue
Block a user