From dbfde5f3400e97b6d9b71a6549ff419dcefc9a95 Mon Sep 17 00:00:00 2001 From: Chris Liddell Date: Wed, 7 Sep 2016 09:58:50 +0100 Subject: Bug 696599: cast disguised wrong type dereference. The code was casting to a gx_device_printer to get to the BLS_force_memory value, but since the target device for a clist device is no longer necessarily a printer device, it wasn't guaranteed that the struct contained that entry. So move BLS_force_memory to the base device type (gx_device), so it's always available. --- base/gdevprn.h | 2 -- base/gxclbits.c | 2 +- base/gxdevcli.h | 1 + base/gxdevice.h | 3 ++- devices/gdevbit.c | 1 + 5 files changed, 5 insertions(+), 4 deletions(-) diff --git a/base/gdevprn.h b/base/gdevprn.h index 8411b89d3..322c3eeb6 100644 --- a/base/gdevprn.h +++ b/base/gdevprn.h @@ -145,7 +145,6 @@ typedef struct bg_print_s { /* ------ Device parameters that must be set ------ */\ /* ------ before calling the device open routine. ------ */\ char fname[prn_fname_sizeof]; /* OutputFile */\ - bool BLS_force_memory;\ /* ------ Other device parameters ------ */\ bool OpenOutputFile;\ bool ReopenPerPage;\ @@ -323,7 +322,6 @@ extern const gx_device_procs prn_bg_procs; gdev_prn_default_get_space_params\ },\ { 0 }, /* fname */\ - 0/*false*/, /* BLS_force_memory */\ 0/*false*/, /* OpenOutputFile */\ 0/*false*/, /* ReopenPerPage */\ 0/*false*/, duplex_set, /* Duplex[_set] */\ diff --git a/base/gxclbits.c b/base/gxclbits.c index 081b0a62d..4313c764e 100644 --- a/base/gxclbits.c +++ b/base/gxclbits.c @@ -752,7 +752,7 @@ clist_change_bits(gx_device_clist_writer * cldev, gx_clist_state * pcls, loc.tile->width * pdepth, loc.tile->height * loc.tile->num_planes, loc.tile->cb_raster, rsize, - decompress_elsewhere | (((gx_device_printer *)cldev->target)->BLS_force_memory ? (1 << cmd_compress_cfe) : 0), + decompress_elsewhere | (cldev->target->BLS_force_memory ? (1 << cmd_compress_cfe) : 0), &dp, &csize); if (code < 0) diff --git a/base/gxdevcli.h b/base/gxdevcli.h index b0bb0094f..6d0d3f43d 100644 --- a/base/gxdevcli.h +++ b/base/gxdevcli.h @@ -781,6 +781,7 @@ typedef struct gdev_pagelist_s { bool LockSafetyParams; /* If true, prevent unsafe changes */\ long band_offset_x; /* offsets of clist band base to (mem device) buffer */\ long band_offset_y; /* for rendering that is phase sensitive (old wtsimdi) */\ + bool BLS_force_memory;\ gx_stroked_gradient_recognizer_t sgr;\ int MaxPatternBitmap; /* Threshold for switching to pattern_clist mode */\ bool page_uses_transparency; /* PDF 1.4 transparency is used. */\ diff --git a/base/gxdevice.h b/base/gxdevice.h index 534d47dc2..76f1b2b61 100644 --- a/base/gxdevice.h +++ b/base/gxdevice.h @@ -122,7 +122,8 @@ 0/*FirstPage*/, 0/*LastPage*/, 0/*PageHandlerPushed*/, 0/*DisablePageHandler*/, 0/* Object Filter*/, 0/*ObjectHandlerPushed*/,\ 0/*PageCount*/, 0/*ShowpageCount*/, 1/*NumCopies*/, 0/*NumCopies_set*/,\ 0/*IgnoreNumCopies*/, 0/*UseCIEColor*/, 0/*LockSafetyParams*/,\ - 0/*band_offset_x*/, 0/*band_offset_y*/, {false}/* sgr */,\ + 0/*band_offset_x*/, 0/*band_offset_y*/, false /*BLS_force_memory*/, \ + {false}/* sgr */,\ 0/* MaxPatternBitmap */, 0/*page_uses_transparency*/,\ { MAX_BITMAP, BUFFER_SPACE,\ { BAND_PARAMS_INITIAL_VALUES },\ diff --git a/devices/gdevbit.c b/devices/gdevbit.c index 675d399af..5a4b17546 100644 --- a/devices/gdevbit.c +++ b/devices/gdevbit.c @@ -305,6 +305,7 @@ const gx_device_bit gs_bitrgbtags_device = 0 , /*LockSafetyParams*/ 0, /*band_offset_x*/ 0, /*band_offset_*/ + false, /*BLS_force_memory*/ {false}, /*sgr*/ 0, /*MaxPatternBitmap*/ 0, /*page_uses_transparency*/ -- cgit v1.2.1