diff options
Diffstat (limited to 'psi/imain.c')
-rw-r--r-- | psi/imain.c | 21 |
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; } |