diff options
author | Julian Smith <jules@op59.net> | 2020-02-20 11:18:11 +0000 |
---|---|---|
committer | Julian Smith <jules@op59.net> | 2020-02-20 14:40:04 +0000 |
commit | fbcf5865f688201fba239c5dde0078e6733538c4 (patch) | |
tree | 1ce3b2066cd2c16d402ac0335ebb9516830fe8db | |
parent | 356e24a53c60710ecfee991bb91cd503e3d9873b (diff) | |
download | ghostpdl-fbcf5865f688201fba239c5dde0078e6733538c4.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.c | 6 | ||||
-rw-r--r-- | psi/zvmem.c | 3 |
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); |