A PostScript interpreter and renderer
CentOS Sources
2018-12-03 2796d4231d6c7bc5d71b5361828c16f2edaea173
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
From: Chris Liddell <chris.liddell@artifex.com>
Date: Sat, 25 Aug 2018 06:45:45 +0000 (+0100)
Subject: Bug 699654(2): preserve LockSafetyParams in the nulldevice
 
Bug 699654(2): preserve LockSafetyParams in the nulldevice
 
The nulldevice does not necessarily use the normal setpagedevice machinery,
but can be set using the nulldevice operator. In which case, we don't preserve
the settings from the original device (in the way setpagedevice does).
 
Since nulldevice does nothing, this is not generally a problem, but in the case
of LockSafetyParams it *is* important when we restore back to the original
device, when LockSafetyParams not being set is "preserved" into the post-
restore configuration.
 
We have to initialise the value to false because the nulldevice is used during
initialisation (before any other device exists), and *must* be writable for
that.
 
http://git.ghostscript.com/?p=ghostpdl.git;a=commit;h=79cccf641486a6595c43f1de1cd7ade696020a31
 
From: Ken Sharp <ken.sharp@artifex.com>
Date: Tue, 28 Aug 2018 15:27:53 +0000 (+0100)
Subject: Bug #699654 (again) and Bug #699677 Improve operator removal for SAFER
 
Bug #699654 (again) and Bug #699677 Improve operator removal for SAFER
 
Take inspiration from the code to remove unused/dangerous operators
and, when SAFER is true, remove a bunch more non-standard operators
or routines.
 
In particular remove the .bindnow operator, which should have been
removed previously for Bug #699677 and remove the
.pushpdf14devicefilter for Bug #699654. Only the PDF interpreter
needs to use that, and the device in question only expects to be used
carefully and in the correct sequence. Make sure nobody can meddle with
it.
 
In addition I removed a number of other operators which are not needed
in normal operation. Some of them, however, are useful so these
(with the exception of .bindnow which is always removed) are only
undefined if SAFER is true.
 
This allows our QA procedure to continue to use them, which is
particularly important in the case of .makeoperator and .setCPSImode.
 
At a later date we may choose to move some of these into the regular
undefinition code, ie not dependent on SAFER.
 
https://git.ghostscript.com/?p=ghostpdl.git;a=commit;h=520bb0ea7519aa3e79db78aaf0589dae02103764
---
 
diff -up ghostscript-9.07/base/gsdevice.c.cve-2018-16863 ghostscript-9.07/base/gsdevice.c
--- ghostscript-9.07/base/gsdevice.c.cve-2018-16863    2018-11-26 10:45:38.685308279 +0100
+++ ghostscript-9.07/base/gsdevice.c    2018-11-26 11:42:31.405515105 +0100
@@ -599,13 +599,17 @@ gx_device_retain(gx_device *dev, bool re
 int
 gs_nulldevice(gs_state * pgs)
 {
+    int code = 0;
+    bool saveLockSafety = false;
     if (pgs->device == 0 || !gx_device_is_null(pgs->device)) {
         gx_device *ndev;
-        int code = gs_copydevice(&ndev, (const gx_device *)&gs_null_device,
+        code = gs_copydevice(&ndev, (const gx_device *)&gs_null_device,
                                  pgs->memory);
 
         if (code < 0)
             return code;
+        if (gs_currentdevice_inline(pgs) != NULL)
+            saveLockSafety = gs_currentdevice_inline(pgs)->LockSafetyParams;
         /*
          * Internal devices have a reference count of 0, not 1,
          * aside from references from graphics states.
@@ -623,9 +627,11 @@ gs_nulldevice(gs_state * pgs)
             set_dev_proc(ndev, get_profile, gx_default_get_profile);
         } 
 
-        return gs_setdevice_no_erase(pgs, ndev);
+        if ((code = gs_setdevice_no_erase(pgs, ndev)) < 0)
+            gs_free_object(pgs->memory, ndev, "gs_copydevice(device)");
+        gs_currentdevice_inline(pgs)->LockSafetyParams = saveLockSafety;
     }
-    return 0;
+    return code;
 }
 
 /* Close a device.  The client is responsible for ensuring that */
diff -up ghostscript-9.07/Resource/Init/gs_init.ps.cve-2018-16863 ghostscript-9.07/Resource/Init/gs_init.ps
--- ghostscript-9.07/Resource/Init/gs_init.ps.cve-2018-16863    2018-11-26 10:51:31.658358967 +0100
+++ ghostscript-9.07/Resource/Init/gs_init.ps    2018-11-26 11:39:03.566039786 +0100
@@ -2083,6 +2083,26 @@ readonly def
 % If we are running in SAFER mode, lock things down
 SAFER { .setsafe } if
 
+/SAFERUndefinePostScriptOperators {
+[
+% Used by our own test suite files
+/.pushpdf14devicefilter    % transparency-example.ps
+/.poppdf14devicefilter     % transparency-example.ps
+/.setopacityalpha          % transparency-example.ps
+/.setshapealpha            % transparency-example.ps
+/.endtransparencygroup     % transparency-example.ps
+/.setdotlength             % Bug687720.ps
+/.sort /.setdebug /.mementolistnewblocks /getenv
+
+/.makeoperator /.setCPSImode              % gs_cet.ps, this won't work on cluster with -dSAFER
+
+/unread
+]
+{systemdict exch .forceundef} forall
+
+//systemdict /SAFERUndefinePostScriptOperators .forceundef
+}bind def
+
 /UndefinePostScriptOperators {
 
 %% This list is of Display PostScript operators. We believe that Display PostScript
@@ -2153,7 +2173,7 @@ SAFER { .setsafe } if
 %/.buildfotn32 /.buildfont42 /.type9mapcid /.type11mapcid /.swapcolors
 %/currentdevice  /.quit /.setuseciecolor /.needinput /.setoverprintmode /.special_op /.dicttomark /.knownget
 %/.FAPIavailable /.FAPIpassfont /.FAPIrebuildfont /.FAPIBuildGlyph /.FAPIBuildChar /.FAPIBuildGlyph9
-%/.tempfile /.numicc_components /.set_outputintent  /.max /.min /.shfill /.vmreclaim /.getpath /.setglobal
+%/.tempfile /.numicc_components /.set_outputintent  /.max /.min /.vmreclaim /.getpath /.setglobal
 %/.setdebug /.mementolistnewblocks /getenv
 ]
 {systemdict exch .forceundef} forall
@@ -2180,13 +2200,6 @@ SAFER { .setsafe } if
 /.settextspacing /.currenttextspacing /.settextleading /.currenttextleading /.settextrise /.currenttextrise
 /.setwordspacing /.currentwordspacing /.settexthscaling /.currenttexthscaling
 
-% Used by our own test suite files
-%/.pushpdf14devicefilter    % transparency-example.ps
-%/.poppdf14devicefilter     % transparency-example.ps
-%/.setopacityalpha          % transparency-example.ps
-%/.setshapealpha            % transparency-example.ps
-%/.endtransparencygroup     % transparency-example.ps
-
 % undefining these causes errors/incorrect output
 %/.settextrenderingmode /.setblendmode /.begintransparencygroup /.settextknockout /check_r6_password /.setstrokeoverprint /.setfilloverprint
 %/.currentstrokeoverprint /.currentfilloverprint /.currentfillconstantalpha /.currentstrokeconstantalpha
@@ -2208,6 +2221,9 @@ SAFER { .setsafe } if
   //systemdict /.delaybind {} .forceput    % reclaim the space
   //systemdict /.bindnow .forceundef    % ditto
   put
+  SAFER {
+    //systemdict /SAFERUndefinePostScriptOperators get exec
+  } if
 %  //systemdict /UndefinePostScriptOperators get exec
 %  //systemdict /UndefinePDFOperators get exec
   //systemdict /.forcecopynew .forceundef    % remove temptation
@@ -2313,6 +2329,9 @@ currentdict /.renderingintentdict .undef
 %% If we are using DELAYBIND we have to defer the undefinition
 %% until .bindnow.
 DELAYBIND not {
+  SAFER {
+    //systemdict /SAFERUndefinePostScriptOperators get exec
+  } if
   //systemdict /UndefinePostScriptOperators get exec
   //systemdict /UndefinePDFOperators .forceundef
 } if
@@ -2323,6 +2342,7 @@ end
  { pop NOGC not { 2 .vmreclaim 0 vmreclaim } if
  } if
 DELAYBIND not {
+  systemdict /.bindnow .undef       % We only need this for DELAYBIND
   systemdict /.forcecopynew .undef    % remove temptation
   systemdict /.forcedef .undef        % ditto
   systemdict /.forceput .undef        % ditto