202 lines
9.8 KiB
Diff
202 lines
9.8 KiB
Diff
From f31702b38fba21153e26c3417c838618e7cfd16f Mon Sep 17 00:00:00 2001
|
|
From: Ken Sharp <ken.sharp@artifex.com>
|
|
Date: Fri, 21 Sep 2018 15:28:15 +0100
|
|
Subject: [PATCH] pdfwrite - fix DSC comment parsing
|
|
|
|
This may affect other DSC parsing utilities. For some reason double
|
|
comment (%%) marks are being interpreted 'sometimes' in gs_init.ps
|
|
as DSC comments. This only happens when reading the init files from disk
|
|
becuase the ROM file system strips comments.
|
|
|
|
Passing these to pdfwrite causes it to drop later DSC comments, such
|
|
as %%Title: and %%Creator: which meant the information wasn't being
|
|
embedded in the document information dictionary.
|
|
|
|
Fix by converting double %% to single % comments, document this in the
|
|
header of gs_init.ps.
|
|
---
|
|
Resource/Init/gs_init.ps | 93 +++++++++++++++++++++-------------------
|
|
1 file changed, 49 insertions(+), 44 deletions(-)
|
|
|
|
diff --git a/Resource/Init/gs_init.ps b/Resource/Init/gs_init.ps
|
|
index ca20f12..d1278ea 100644
|
|
--- a/Resource/Init/gs_init.ps
|
|
+++ b/Resource/Init/gs_init.ps
|
|
@@ -20,6 +20,11 @@
|
|
% %% Replace <n> <file(s)>
|
|
% indicate places where the next <n> lines should be replaced by
|
|
% the contents of <file(s)>, when creating a single merged init file.
|
|
+%
|
|
+% For reasons not clear to me, some cases of %% are being treated as
|
|
+% DSC comments when (and only when) the resource files are disk based
|
|
+% This can kill DSC parsing for pdfwrite at least, so avoid using
|
|
+% double % comments in this file.
|
|
|
|
% The interpreter can call out to PostScript code. All procedures
|
|
% called in this way, and no other procedures defined in these
|
|
@@ -136,12 +141,12 @@ currentdict /PDFNOCIDFALLBACK known /PDFNOCIDFALLBACK exch def
|
|
ifelse
|
|
.bind def
|
|
|
|
-%% This was a debugging switch removed in 9.22, no other software
|
|
-%% should have had any regard for it, and even if testing its value
|
|
-%% should have checked its existence first. However pstotext, an
|
|
-%% ancient and no longer maintained piece of softare, did check
|
|
-%% its value unconditionally. So we retain this key in the dictionary
|
|
-%% purely for backward compatibility.
|
|
+% This was a debugging switch removed in 9.22, no other software
|
|
+% should have had any regard for it, and even if testing its value
|
|
+% should have checked its existence first. However pstotext, an
|
|
+% ancient and no longer maintained piece of softare, did check
|
|
+% its value unconditionally. So we retain this key in the dictionary
|
|
+% purely for backward compatibility.
|
|
/NOBIND false def
|
|
|
|
currentdict /BATCH known /BATCH exch def
|
|
@@ -2123,12 +2128,12 @@ currentdict /tempfilepaths undef
|
|
//SAFETY /safe //true .forceput % overrides readonly
|
|
} .bind executeonly odef
|
|
|
|
-%% This is only used during startup. Its required so that
|
|
-%% we can detect in setpagdevice that we are in fact in startup
|
|
-%% and allocate a *global* instead of local VM. We need it to be
|
|
-%% global to satisfy Display PostScript (see start of /setpagdevice
|
|
-%% in gs_setpd.ps)
|
|
-%%
|
|
+% This is only used during startup. Its required so that
|
|
+% we can detect in setpagdevice that we are in fact in startup
|
|
+% and allocate a *global* instead of local VM. We need it to be
|
|
+% global to satisfy Display PostScript (see start of /setpagdevice
|
|
+% in gs_setpd.ps)
|
|
+%
|
|
/.locksafeglobal {
|
|
.locksafe_userparams
|
|
systemdict /getenv {pop //false} put
|
|
@@ -2157,8 +2162,8 @@ currentdict /tempfilepaths undef
|
|
.locksafe
|
|
} .bind executeonly odef
|
|
|
|
-%% See /.locksafeglobal above.
|
|
-%%
|
|
+% See /.locksafeglobal above.
|
|
+%
|
|
/.setsafeglobal {
|
|
SAFETY /safe get not {
|
|
<<
|
|
@@ -2193,22 +2198,22 @@ SAFER { .setsafeglobal } if
|
|
|
|
/UndefinePostScriptOperators {
|
|
|
|
- %% This list is of Display PostScript operators. We believe that Display PostScript
|
|
- %% was never fully implemented and the only known user, GNUStep, is no longer
|
|
- %% using it. So lets remove it.
|
|
+ % This list is of Display PostScript operators. We believe that Display PostScript
|
|
+ % was never fully implemented and the only known user, GNUStep, is no longer
|
|
+ % using it. So lets remove it.
|
|
[
|
|
/condition /currentcontext /detach /.fork /join /.localfork /lock /monitor /notify
|
|
/wait /yield /.currentscreenphase /.setscreenphase /.image2 /eoviewclip /initviewclip
|
|
/viewclip /viewclippath /defineusername
|
|
- %% NeXT DPS extensions
|
|
+ % NeXT DPS extensions
|
|
/currentalpha /setalpha /.alphaimage /composite /compositerect /dissolve /sizeimagebox /.sizeimageparams
|
|
]
|
|
{systemdict exch .forceundef} forall
|
|
|
|
- %% This list is of operators which no longer appear to be used, and which we do not believe
|
|
- %% to have any real use. For now we will undefine the operstors so they cannot easily be used
|
|
- %% but can be easily restored (just delete the name from the list in the array). In future
|
|
- %% we may remove the operator and the code implementation entirely.
|
|
+ % This list is of operators which no longer appear to be used, and which we do not believe
|
|
+ % to have any real use. For now we will undefine the operstors so they cannot easily be used
|
|
+ % but can be easily restored (just delete the name from the list in the array). In future
|
|
+ % we may remove the operator and the code implementation entirely.
|
|
[
|
|
/.bitadd /.charboxpath /.cond /.runandhide /.popdevicefilter
|
|
/.execfile /.filenamesplit /.file_name_parent
|
|
@@ -2217,15 +2222,15 @@ SAFER { .setsafeglobal } if
|
|
/.currentlimitclamp /.dotorientation /.setaccuratecurves /.setcurvejoin /.setdashadapt /.setdotorientation
|
|
/.setlimitclamp /.currentscreenlevels /.dashpath /.pathbbox /.identeq /.identne /.tokenexec /.forgetsave /.pantonecallback
|
|
|
|
- %% Used by our own test suite files
|
|
- %%/.setdotlength % Bug687720.ps
|
|
+ % Used by our own test suite files
|
|
+ %/.setdotlength % Bug687720.ps
|
|
]
|
|
{systemdict exch .forceundef} forall
|
|
|
|
- %% This list of operators are used internally by various parts of the Ghostscript startup code.
|
|
- %% Since each operator is a potential security vulnerability, and any operator listed here
|
|
- %% is not required once the initialisation is complete and functions are bound, we undefine
|
|
- %% the ones that aren't needed at runtime.
|
|
+ % This list of operators are used internally by various parts of the Ghostscript startup code.
|
|
+ % Since each operator is a potential security vulnerability, and any operator listed here
|
|
+ % is not required once the initialisation is complete and functions are bound, we undefine
|
|
+ % the ones that aren't needed at runtime.
|
|
[
|
|
/.callinstall /.callbeginpage /.callendpage
|
|
/.currentstackprotect /.setstackprotect /.errorexec /.finderrorobject /.installsystemnames /.bosobject /.fontbbox
|
|
@@ -2297,12 +2302,12 @@ SAFER { .setsafeglobal } if
|
|
} .bind executeonly def % must be bound and hidden for .forceundef
|
|
|
|
/UndefinePDFOperators {
|
|
- %% This list of operators are used internally by various parts of the Ghostscript PDF interpreter.
|
|
- %% Since each operator is a potential security vulnerability, and any operator listed here
|
|
- %% is not required once the initislisation is complete and functions are bound, we undefine
|
|
- %% the ones that aren't needed at runtime.
|
|
- %% This function is only called if DELAYBIND is true. It is a copy of the code at the end of pdf_main.ps
|
|
- %% and must be maintained in parallel with it.
|
|
+ % This list of operators are used internally by various parts of the Ghostscript PDF interpreter.
|
|
+ % Since each operator is a potential security vulnerability, and any operator listed here
|
|
+ % is not required once the initislisation is complete and functions are bound, we undefine
|
|
+ % the ones that aren't needed at runtime.
|
|
+ % This function is only called if DELAYBIND is true. It is a copy of the code at the end of pdf_main.ps
|
|
+ % and must be maintained in parallel with it.
|
|
[
|
|
/.pdfawidthshow /.pdfwidthshow /.currentblackptcomp /.setblackptcomp
|
|
/.setfillcolor /.setfillcolorspace /.setstrokecolor /.setstrokecolorspace /.currentrenderingintent /.setrenderingintent
|
|
@@ -2411,13 +2416,13 @@ $error /.nosetlocal //false put
|
|
|
|
(END GLOBAL) VMDEBUG
|
|
|
|
-%% .savelocalstate is part of Display PostScript (if included). Part of the function of
|
|
-%% the .savelocalstate routine is to store the 'initial saved gstate' (savedinitialgstate)
|
|
-%% in systemdict. The code in dps1.c, gstate_check_space, disallows writing or creating
|
|
-%% gstates in global VM in certain conditions. If we execute setpagedevice before we
|
|
-%% reach this point, we must ensure that we do so using /..StartupGlobal so that
|
|
-%% the dictionary is defined in global VM, because the gstate contains a pointer to the
|
|
-%% device dictionary, and if that is allocated in local VM we will fail the gstate check.
|
|
+% .savelocalstate is part of Display PostScript (if included). Part of the function of
|
|
+% the .savelocalstate routine is to store the 'initial saved gstate' (savedinitialgstate)
|
|
+% in systemdict. The code in dps1.c, gstate_check_space, disallows writing or creating
|
|
+% gstates in global VM in certain conditions. If we execute setpagedevice before we
|
|
+% reach this point, we must ensure that we do so using /..StartupGlobal so that
|
|
+% the dictionary is defined in global VM, because the gstate contains a pointer to the
|
|
+% device dictionary, and if that is allocated in local VM we will fail the gstate check.
|
|
/.savelocalstate where {
|
|
% If we might create new contexts, save away copies of all dictionaries
|
|
% referenced from systemdict that are stored in local VM,
|
|
@@ -2452,8 +2457,8 @@ currentdict /.shadingtypes .undef
|
|
currentdict /.wheredict .undef
|
|
currentdict /.renderingintentdict .undef
|
|
|
|
-%% If we are using DELAYBIND we have to defer the undefinition
|
|
-%% until .bindnow.
|
|
+% If we are using DELAYBIND we have to defer the undefinition
|
|
+% until .bindnow.
|
|
DELAYBIND not {
|
|
SAFER {
|
|
//systemdict /SAFERUndefinePostScriptOperators get exec
|
|
@@ -2485,7 +2490,7 @@ DELAYBIND not {
|
|
systemdict /.forceundef .undef % ditto
|
|
} if
|
|
|
|
-%% Can't remove this one until the last minute :-)
|
|
+% Can't remove this one until the last minute :-)
|
|
DELAYBIND not {
|
|
systemdict /.undef .undef
|
|
} if
|
|
--
|
|
2.20.1
|
|
|