summaryrefslogtreecommitdiff
path: root/Master/tlpkg/tlgs/Resource/Init/pdf_base.ps
diff options
context:
space:
mode:
Diffstat (limited to 'Master/tlpkg/tlgs/Resource/Init/pdf_base.ps')
-rw-r--r--Master/tlpkg/tlgs/Resource/Init/pdf_base.ps60
1 files changed, 39 insertions, 21 deletions
diff --git a/Master/tlpkg/tlgs/Resource/Init/pdf_base.ps b/Master/tlpkg/tlgs/Resource/Init/pdf_base.ps
index 1e7bd701bbc..2453b6bc1d3 100644
--- a/Master/tlpkg/tlgs/Resource/Init/pdf_base.ps
+++ b/Master/tlpkg/tlgs/Resource/Init/pdf_base.ps
@@ -1,4 +1,4 @@
-% Copyright (C) 2001-2020 Artifex Software, Inc.
+% Copyright (C) 2001-2021 Artifex Software, Inc.
% All Rights Reserved.
%
% This software is provided AS-IS with no warranty, either express or
@@ -779,17 +779,19 @@ currentdict /token_nofail_dict .undef
% Read the data for all objects. We check to see if we get
% the number of objects that we expect.
% Stack: strm# objstreamdict N objectstream [obj#] PDFDEBUG
- mark 3 -1 roll % Get objectstream
+ /ResolveObjectStreamMark 3 -1 roll
count 4 index add % Determine stack depth with objects
3 1 roll
resolveobjstreamopdict .pdfrun % Get PDF objects
- count counttomark 1 add index ne
+ count /ResolveObjectStreamMark CountToKey not {0} if
+ 1 add index
+ ne
{
- count counttomark 1 add index gt {
+ count /ResolveObjectStreamMark CountToKey not {0} if
+ 1 add index gt {
( **** Error: Incorrect object count in object stream (too many objects).\n) pdfformaterror
( Output may be incorrect.\n) pdfformaterror
} if
-
% Its possible for us to end up here with a valid file. The way we work is to read the
% stream and tokenise all the objects, but that assumes there will be delimiters or
% whitespace between each object in the stream. We can easily think of cases where
@@ -821,13 +823,13 @@ currentdict /token_nofail_dict .undef
% the stack, in the right order, preceded by a mark, a count, and an array containing
% all the object numbers.
- % First, discard everything we read up to now; we can reuse the mark which was placed
- % by the preceding code to do this, as long as we remember to replace that mark.
+ % First, discard everything we read up to now; we can reuse the 'mark' which was placed
+ % by the preceding code to do this, as long as we remember to replace that 'mark'.
% Handily this will leave the count and the array which contains the object numbers in place.
- cleartomark
+ /ResolveObjectStreamMark ClearToKey
- % Replace the mark consumed by conttomark above, so that we match what the code following this error handling expects.
- mark
+ % Replace the 'mark' consumed by conttomark above, so that we match what the code following this error handling expects.
+ /ResolveObjectStreamMark
% copy the ObjStm dictionary and then copy the count of objects expected
4 index 4 index
@@ -894,14 +896,15 @@ currentdict /token_nofail_dict .undef
% but leave count of objects. Check that aginst the number of objects
% retrieved. If we got too few then issue a warning.
- pop pop exch pop counttomark 1 sub lt {
+ pop pop exch pop /ResolveObjectStreamMark CountToKey not {1} if
+ 1 sub lt {
( **** Error: Incorrect object count in object stream (too few objects).\n) pdfformaterror
( Output may be incorrect.\n) pdfformaterror
} if
} if
% We have the object data
- counttomark array astore % Put objects into an array
+ /ResolveObjectStreamMark CountToKey not {0} if array astore
exch pop exch pop % Remove mark and count
currentdict //no_debug_dict eq { end } if % Restore debug context
% Save the objects into Objects
@@ -1090,15 +1093,30 @@ currentdict /no_debug_dict undef
% Some (bad) PDf files have invalid stream lengths. This causes problems
% if we reposition beyond the end of the file. So we compare the given
% length to number of bytes left in the file.
- dup /Length knownoget {
- dup PDFfile bytesavailable lt { % compare to to bytes left in file
- PDFfile fileposition % reposition to the end of stream
- add PDFfile exch setfileposition
- } {
- pop % bad stream length - do not reposition.
- % This will force a length warning below
- } ifelse
- } if
+ dup mark exch /Length {knownoget} stopped {
+ % Bug 703372 is a PDF file where the XRef stream dictionary has a Length which is an
+ % indirect object. Clearly we cannot look that up in an xref which we haevn't yet
+ % read! We catch the error from knownoget and do not reposition the steam. After
+ % that the normal recovery code kicks in and we will eventually manage to read
+ % the compressed xref.
+ cleartomark
+ }
+ {
+ {
+ dup type /realtype eq {
+ ( **** Warning: stream length is a real number; converting to integer.\n) pdfformatwarning
+ cvi 2 copy /Length exch put
+ } if
+ dup PDFfile bytesavailable lt { % compare to to bytes left in file
+ PDFfile fileposition % reposition to the end of stream
+ add PDFfile exch setfileposition
+ } {
+ pop % bad stream length - do not reposition.
+ % This will force a length warning below
+ } ifelse
+ } if
+ pop % the mark from the Length dereference guard above.
+ } ifelse
} {
pop
% We're already reading from a stream, which we can't reposition.