Fix for Bug 686946, ps2epsi segfaults

"Jeong Kim" <[email protected]>
Newsgroups gmane.comp.printing.ghostscript.patches
Message-ID <[email protected]>
Reviewers,

Running ps2epsi with any file causes a SEGV error.
When 'ps2epsi' procedure in ps2epsi.ps is executed
an image device is made and is set by 'setdevice' operator.
Then .setsafe is executed and thus setpagedevice is called.
The SEGV occurs when 'setpagedevice' which is followed by 
'setdevice' and 'fillpage' is called.

Following is a simplified PostScript code for error reproduction.

matrix 1056 816 null
makeimagedevice
setdevice
<< >> setpagedevice

When 'setdevice' is called, a device is opened and 'setpagedevice'
is called the opened device is closed. And any following attempts
to draw something (e.g. fillpage) in the device would fail and 
makes a SEGV.

Again, setpagedevice calls another setdevice and this calls
'gs_setdevice_no_init' and 'gs_closedevice' consequently.

In detail, 'gs_setdevice_no_init' calls 'gs_closedevice' to
close an open device when the following condition is satisfied.

    if (pgs->device != NULL && pgs->device->rc.ref_count == 1) {

I think the reason why we close a device when gs_setdevice_no_init
is called, is to close the current device when a new device is set.

So we must not close device when current device and new device 
to set is same.

Following is the modified code to prevent closing current device
which is same with new device.

    if (pgs->device != NULL && 
	pgs->device->rc.ref_count == 1 && 
	pgs->device != dev) {

With this simple patch, SEGV disppeared and ps2epsi works good.

Jeong

Log:
gs_setdevice_no_init function sometimes closes a device
when the current device and a new device to set is same.
Now it doesn't. Bug 686946.

Index: src/gsdevice.c
===================================================================
RCS file: /cvs/ghostscript/gs/src/gsdevice.c,v
retrieving revision 1.19
diff -C2 -r1.19 gsdevice.c
*** src/gsdevice.c      25 Feb 2003 12:25:18 -0000      1.19
--- src/gsdevice.c      10 Aug 2003 13:58:45 -0000
***************
*** 402,406 ****
       * device parameters.
       */
!     if (pgs->device != NULL && pgs->device->rc.ref_count == 1) {
        int code = gs_closedevice(pgs->device);

--- 402,408 ----
       * device parameters.
       */
!     if (pgs->device != NULL &&
!       pgs->device->rc.ref_count == 1 &&
!       pgs->device != dev) {
        int code = gs_closedevice(pgs->device);
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.