summaryrefslogtreecommitdiffstats
path: root/abs/core/ghostscript/bug_696246.diff
blob: 4719eb5f400d6b0fd38a77dc3c0ba91372cfa328 (plain)
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
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
From: Chris Liddell <chris.liddell@artifex.com>
Date: Fri, 9 Oct 2015 09:54:10 +0000 (+0100)
Subject: Bug 696246: devijs account for device sublassing.
X-Git-Url: http://git.ghostscript.com/?p=ghostpdl.git;a=commitdiff_plain;h=b68e05c3

Bug 696246: devijs account for device sublassing.

The IJS device wasn't coping with the possibility it had been subclassed.

No cluster differences
---

diff --git a/devices/gdevijs.c b/devices/gdevijs.c
index 5520716..a2e21ea 100644
--- a/devices/gdevijs.c
+++ b/devices/gdevijs.c
@@ -827,6 +827,10 @@ gsijs_open(gx_device *dev)
     if (code < 0)
         return code;
 
+    while (dev->child)
+        dev = dev->child;
+    ijsdev = (gx_device_ijs *)dev;
+
     if (use_outputfd) {
         /* Note: dup() may not be portable to all interesting IJS
            platforms. In that case, this branch should be #ifdef'ed out.
From: Chris Liddell <chris.liddell@artifex.com>
Date: Fri, 9 Oct 2015 11:54:44 +0000 (+0100)
Subject: Bug 696246: patch the memory manager fields for sublassed devices.
X-Git-Url: http://git.ghostscript.com/?p=ghostpdl.git;a=commitdiff_plain;h=95553954

Bug 696246: patch the memory manager fields for sublassed devices.

When we subclass a device, we were patching the "visible" type field - that is,
the one referenced directly in the device structure. We were not patching
the type information in the memory object header so, in particular, the
garbage collector could end up calling the wrong methods for the subclassed
device.

No cluster differences.
---

diff --git a/base/gdevdflt.c b/base/gdevdflt.c
index 5768937..305f89d 100644
--- a/base/gdevdflt.c
+++ b/base/gdevdflt.c
@@ -17,6 +17,8 @@
 #include "math_.h"
 #include "memory_.h"
 #include "gx.h"
+#include "gsstruct.h"
+#include "gxobj.h"
 #include "gserrors.h"
 #include "gsropt.h"
 #include "gxcomp.h"
@@ -26,6 +28,7 @@
 #include "gstrans.h"        /* For gs_pdf14trans_t */
 #include "gxistate.h"       /* for gs_image_state_s */
 
+
 /* defined in gsdpram.c */
 int gx_default_get_param(gx_device *dev, char *Param, void *list);
 
@@ -1294,6 +1297,11 @@ int gx_device_subclass(gx_device *dev_to_subclass, gx_device *new_prototype, uns
     ptr1 = ((char *)new_prototype) + sizeof(gx_device);
     memcpy(ptr, ptr1, new_prototype->params_size - sizeof(gx_device));
 
+    /* We have to patch up the "type" parameters that the memory manage/garbage
+     * collector will use, as well.
+     */
+    (((obj_header_t *)dev_to_subclass) - 1)->o_type = new_prototype->stype;
+
     /* If the original device's stype structure was dynamically allocated, we need
      * to 'fixup' the contents, it's procs need to point to the new device's procs
      * for instance.
diff --git a/base/lib.mak b/base/lib.mak
index de78333..09b70e5 100644
--- a/base/lib.mak
+++ b/base/lib.mak
@@ -1210,7 +1210,7 @@ $(GLOBJ)gdevdsha.$(OBJ) : $(GLSRC)gdevdsha.c $(AK) $(gx_h)\
 
 $(GLOBJ)gdevdflt.$(OBJ) : $(GLSRC)gdevdflt.c $(AK) $(gx_h)\
  $(gserrors_h) $(gsropt_h) $(gxcomp_h) $(gxdevice_h) $(gxdevsop_h) $(math__h)\
- $(MAKEDIRS)
+ $(gsstruct_h) $(gxobj_h) $(MAKEDIRS)
 	$(GLCC) $(GLO_)gdevdflt.$(OBJ) $(C_) $(GLSRC)gdevdflt.c
 
 $(GLOBJ)gdevdgbr.$(OBJ) : $(GLSRC)gdevdgbr.c $(AK) $(gx_h)\
From 007bd77d08d800e6b07274d62e3c91be7c4a3f47 Mon Sep 17 00:00:00 2001
From: Ken Sharp <ken.sharp@artifex.com>
Date: Mon, 12 Oct 2015 16:36:11 +0100
Subject: [PATCH] Guard against NULL 'base' for non-clist devices

Bug #696246 "Ghostscript 9.18 with -dFirstPage/-dLastPage fails for ijs and some x11 devices"

This is actually for the plib device. This device is currently (this will
change in the next commit) set to BandingAuto, despite the fact that the
device only works in banding mode.

This can lead to use arriving in gdev_mem_open_scan_lines with all of
mdev->bitmap_memory, mdev->line_pointers_memory and mdev->base being set to
NULL. The code didn't check and assumed that mdev->base was valid, which
led to a later seg fault.

Here we just check to make sure it isn't NULL and return an error if it is.
This doesn't prevent the possibility of garbage uninitialised values, but
there's not much we can do to check that at this stage, devices are supposed
to be initialised to 0 so this 'shouldn't' happen.

No differences expected.
---
 base/gdevmem.c | 3 +++
 1 file changed, 3 insertions(+)

diff --git a/base/gdevmem.c b/base/gdevmem.c
index 3019451f..507fa19 100644
--- a/base/gdevmem.c
+++ b/base/gdevmem.c
@@ -471,6 +471,9 @@ gdev_mem_open_scan_lines(gx_device_memory *mdev, int setup_height)
         line_pointers_adjacent = false;
     }
     if (line_pointers_adjacent) {
+        if (mdev->base == 0)
+            return_error(gs_error_rangecheck);
+
         gdev_mem_bits_size(mdev, mdev->width, mdev->height, &size);
         mdev->line_ptrs = (byte **)(mdev->base + size);
     }
-- 
2.5.1

From 1bdbe4f87dc57648821e613ebcc591b84e8b35b3 Mon Sep 17 00:00:00 2001
From: Ken Sharp <ken.sharp@artifex.com>
Date: Mon, 12 Oct 2015 16:38:09 +0100
Subject: [PATCH] Ensure plib devices always use the clist

Bug #696246 "Ghostscript 9.18 with -dFirstPage/-dLastPage fails for ijs and some x11 devices"

the plib* class of devices only work if clist is present, but previously
they left the banding_type set to 'auto', which meant that under some
conditions we did not use the clist, leading to a seg fault.

This commit simply forces banding_type to be 'BandingAlways'.

No differences expected.
---
 devices/gdevplib.c | 2 ++
 1 file changed, 2 insertions(+)

diff --git a/devices/gdevplib.c b/devices/gdevplib.c
index 51bd7ea..87c6f46 100644
--- a/devices/gdevplib.c
+++ b/devices/gdevplib.c
@@ -691,6 +691,8 @@ plib_open(gx_device * pdev)
     bdev->printer_procs.buf_procs.size_buf_device = plib_size_buf_device;
     pdev->is_planar = 1;
 
+    bdev->space_params.banding_type = BandingAlways;
+
     /* You might expect us to call gdev_prn_open_planar rather than
      * gdev_prn_open, but if we do that, it overwrites the 2 function
      * pointers we've just overwritten! */
-- 
2.5.1

From 5571ddfa377c5d7d98f55af40e693814ac287ae4 Mon Sep 17 00:00:00 2001
From: Ken Sharp <ken.sharp@artifex.com>
Date: Mon, 12 Oct 2015 16:40:10 +0100
Subject: [PATCH] prevent rinkj device crash when misconfigured (no SetupFile)

Bug #696246 "Ghostscript 9.18 with -dFirstPage/-dLastPage fails for ijs and some x11 devices"

The rinkj device requires a SetupFile to be given as a device parameter,
however it doesn't actually check to see if one is given, and just tries
to open the filename, with a predictable crash when none is given.

Here we check the filename and attempt to ensure it is both present and
minimally valid.

No differences expected.
---
 devices/gdevrinkj.c | 4 ++++
 1 file changed, 4 insertions(+)

diff --git a/devices/gdevrinkj.c b/devices/gdevrinkj.c
index f55bc60..12c396a 100644
--- a/devices/gdevrinkj.c
+++ b/devices/gdevrinkj.c
@@ -1193,6 +1193,10 @@ rinkj_print_page(gx_device_printer *pdev, FILE *file)
     int code = 0;
     RinkjDevice *cmyk_dev;
 
+    if (rdev->setup_fn == 0 || rdev->setup_fn[0] == 0) {
+        emprintf(rdev->memory, "Error, SetupFile not defined, output aborted\n");
+        return 0;
+    }
     cmyk_dev = rinkj_init(rdev, file);
     if (cmyk_dev == 0)
         return gs_note_error(gs_error_ioerror);
-- 
2.5.1