summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJulian Smith <jules@op59.net>2020-02-20 11:18:11 +0000
committerChris Liddell <chris.liddell@artifex.com>2020-02-26 08:18:49 +0000
commit777d79315e0094bef83d241bc0d5683ea6775a55 (patch)
tree82dd83a2476449945d62c406518c6b182dcce4d1
parent6db4560f1e31bb92321894e0d008d310aa600097 (diff)
downloadghostpdl-777d79315e0094bef83d241bc0d5683ea6775a55.tar.gz
Fix for MEMENTO_FAILAT=115802: make gs_gsave_for_save() call gs_gsave() so it can restore after error.
Previously, zsave() called gs_gsave_for_save() then gs_gsave(), but if gs_gsave() failed we ended up with SEGV in finalise code. To allow zsave() to restore things after gs_gsave() failure, we would need to add an include of base/gxgstate.h. Instead we remove the call of gs_gsave() from zsave() and append it to gs_gsave_for_save(), where things can be easily restored if it fails. [There are no other callers of gs_gsave_for_save().] Fixes: MEMENTO_FAILAT=115802 LD_LIBRARY_PATH=../libbacktrace/.libs ./membin/gpdl -sDEVICE=bit -o /dev/null examples/tiger.eps
-rw-r--r--base/gsstate.c6
-rw-r--r--psi/zvmem.c3
2 files changed, 6 insertions, 3 deletions
diff --git a/base/gsstate.c b/base/gsstate.c
index 79e376280..90cb28718 100644
--- a/base/gsstate.c
+++ b/base/gsstate.c
@@ -354,6 +354,12 @@ gs_gsave_for_save(gs_gstate * pgs, gs_gstate ** psaved)
/* Cut the stack so we can't grestore past here. */
*psaved = pgs->saved;
pgs->saved = 0;
+
+ code = gs_gsave(pgs);
+ if (code < 0) {
+ pgs->saved = *psaved;
+ return code;
+ }
return code;
fail:
if (new_cpath)
diff --git a/psi/zvmem.c b/psi/zvmem.c
index b6e366fa6..5c0810f3e 100644
--- a/psi/zvmem.c
+++ b/psi/zvmem.c
@@ -84,9 +84,6 @@ zsave(i_ctx_t *i_ctx_p)
code = gs_gsave_for_save(igs, &prev);
if (code < 0)
return code;
- code = gs_gsave(igs);
- if (code < 0)
- return code;
vmsave->gsave = prev;
push(1);
make_tav(op, t_save, 0, saveid, sid);