summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'psi/imain.c')
-rw-r--r--psi/imain.c21
1 files changed, 16 insertions, 5 deletions
diff --git a/psi/imain.c b/psi/imain.c
index 95ef5b6b..db3fd2a1 100644
--- a/psi/imain.c
+++ b/psi/imain.c
@@ -1126,7 +1126,15 @@ gs_main_finit(gs_main_instance * minst, int exit_status, int code)
if (idmemory->reclaim != 0) {
code = interp_reclaim(&minst->i_ctx_p, avm_global);
- if (code < 0) {
+ /* We ignore gs_error_VMerror because it comes from gs_vmreclaim()
+ calling context_state_load(), and we don't seem to depend on the
+ missing fields. */
+ if (code == gs_error_VMerror) {
+ if (exit_status == 0 || exit_status == gs_error_Quit) {
+ exit_status = gs_error_VMerror;
+ }
+ }
+ else if (code < 0) {
ref error_name;
if (tempnames)
free(tempnames);
@@ -1140,11 +1148,10 @@ gs_main_finit(gs_main_instance * minst, int exit_status, int code)
else {
emprintf1(imemory, "UNKNOWN ERROR %d reclaiming the memory while the interpreter finalization.\n", code);
}
-#ifdef MEMENTO_SQUEEZE_BUILD
- if (code != gs_error_VMerror ) return gs_error_Fatal;
-#else
- return gs_error_Fatal;
+#ifdef MEMENTO
+ if (Memento_squeezing() && code != gs_error_VMerror ) return gs_error_Fatal;
#endif
+ return gs_error_Fatal;
}
i_ctx_p = minst->i_ctx_p; /* interp_reclaim could change it. */
}
@@ -1260,6 +1267,10 @@ gs_main_finit(gs_main_instance * minst, int exit_status, int code)
set_lib_path_length(minst, 0);
gs_free_object(minst->heap, minst->lib_path.container.value.refs, "lib_path array");
+ if (minst->init_done == 0 && i_ctx_p) {
+ /* This fixes leak if memento forces failure in gs_main_init1(). */
+ dmem = *idmemory;
+ }
ialloc_finit(&dmem);
return exit_status;
}