From 19391ab543e51c2f67514850234ea1ab0085b5f7 Mon Sep 17 00:00:00 2001 From: Ian Butterworth Date: Wed, 19 Mar 2025 23:12:05 -0400 Subject: [PATCH 1/2] don't free regex objects in exit-time finalizer calls --- base/regex.jl | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/base/regex.jl b/base/regex.jl index 9d5c146a6e840..2cb49610dc300 100644 --- a/base/regex.jl +++ b/base/regex.jl @@ -39,7 +39,12 @@ mutable struct Regex <: AbstractPattern end re = compile(new(pattern, compile_options, match_options, C_NULL)) finalizer(re) do re - re.regex == C_NULL || PCRE.free_re(re.regex) + # don't free during exit because tasks may still be running and + # using it. Issue #57817 + during_exit = Base._atexit_hooks_finished + if re.regex != C_NULL && !during_exit + PCRE.free_re(re.regex) + end end re end From d8cb3b234d08ae7acd54393b9b39049252819d94 Mon Sep 17 00:00:00 2001 From: Ian Butterworth Date: Wed, 19 Mar 2025 23:33:54 -0400 Subject: [PATCH 2/2] add test --- test/regex.jl | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/test/regex.jl b/test/regex.jl index e5f1428527512..ca411b26bbacc 100644 --- a/test/regex.jl +++ b/test/regex.jl @@ -245,3 +245,11 @@ end @test match(re, "ababc").match === SubString("ababc", 3:5) end end + +@testset "#57817: Don't free Regex during exit finalizer calls" begin + # this shouldn't segfault + cmd = `$(Base.julia_cmd()) -t2 --startup-file=no -e 're = Regex(""); Threads.@spawn match(re, "", 1, UInt32(0))'` + for i in 1:10 + @test success(pipeline(cmd, stderr=stderr)) + end +end