# New Ticket Created by Bram Geron # Please include the string: [perl #44363] # in the subject line of all future correspondence about this issue. # <URL: http://rt.perl.org/rt3/Ticket/Display.html?id=44363 >
At Parrot exit, we force-destroy all PObjs. It can happen that a context is destroyed after its sub is destroyed. Usually that's not a problem, but if you run with -D80 (show when contexts are destroyed, and print out the name of the sub) we may segfault, because the Parrot_sub structure is already freed. This patch fixes the segfault by turning off -D80 just before force-freeing all PObjs. inter_create.c | 8 ++++++++ 1 file changed, 8 insertions(+) This patch is unified after applying the patch from bug #44351. You probably want to apply that first, or you will get warnings from patch(1). -- Bram Geron | GPG 0xE7B9E65E
diff --git a/src/inter_create.c b/src/inter_create.c index 307fa71..6a6c4aa 100644 --- a/src/inter_create.c +++ b/src/inter_create.c @@ -315,6 +315,14 @@ Parrot_really_destroy(PARROT_INTERP, SHIM(int exit_code), SHIM(void *arg)) interp->arena_base->DOD_block_level = interp->arena_base->GC_block_level = 0; + if (Interp_debug_TEST(interp, PARROT_CTX_DESTROY_DEBUG_FLAG)) { + PIO_eprintf(interp, "We are about to exit and force-free subs, so turning off -D%x. It might\n" + "generate segfaults when we destroy a context of which the sub is already\n" + "dead.\n", + PARROT_CTX_DESTROY_DEBUG_FLAG); + Interp_debug_CLEAR(interp, PARROT_CTX_DESTROY_DEBUG_FLAG); + } + if (Interp_trace_TEST(interp, ~0)) { PIO_eprintf(interp, "ParrotIO objects (like stdout and stderr) are about to be closed, so clearing trace flags.\n"); Interp_trace_CLEAR(interp, ~0);