You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
201 lines
9.8 KiB
201 lines
9.8 KiB
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 |
|
|
|
|