From: Chris Liddell 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 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 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 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 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