Skip to content

Commit

Permalink
PATCH: [perl #133959] Free BSD broken tests
Browse files Browse the repository at this point in the history
Commit 70bd6bc fixed a leak (likely due
to a bug in glibc) by not duplicating the C locale object.  However,
that meant that there's only one copy running around.  And freeing that
will cause havoc, as its supposed to be there until destruction.  What
appears to be happening is that the current locale object is freed upon
thread destruction, and that could be this global one.  But I don't
understand why it's only happening on Free BSD and only on this version.
But this commit fixes the problem there, and makes sense.  Simply don't
free this global object upon thread destruction.

This commit also changes it so it doesn't get destroyed at destruction
time, leaving it to the final PERL_SYS_TERM to free.  I'm not sure, but
I think this fixes any issues with embedded perls.
  • Loading branch information
khwilliamson committed Mar 27, 2019
1 parent fd8def1 commit e72200e
Show file tree
Hide file tree
Showing 2 changed files with 6 additions and 2 deletions.
2 changes: 1 addition & 1 deletion locale.c
Expand Up @@ -5606,7 +5606,7 @@ Perl_thread_locale_term()

{ /* Free up */
locale_t cur_obj = uselocale(LC_GLOBAL_LOCALE);
if (cur_obj != LC_GLOBAL_LOCALE) {
if (cur_obj != LC_GLOBAL_LOCALE && cur_obj != PL_C_locale_obj) {
freelocale(cur_obj);
}
}
Expand Down
6 changes: 5 additions & 1 deletion perl.c
Expand Up @@ -1153,7 +1153,11 @@ perl_destruct(pTHXx)
/* This also makes sure we aren't using a locale object that gets freed
* below */
const locale_t old_locale = uselocale(LC_GLOBAL_LOCALE);
if (old_locale != LC_GLOBAL_LOCALE) {
if ( old_locale != LC_GLOBAL_LOCALE
# ifdef USE_POSIX_2008_LOCALE
&& old_locale != PL_C_locale_obj
# endif
) {
DEBUG_Lv(PerlIO_printf(Perl_debug_log,
"%s:%d: Freeing %p\n", __FILE__, __LINE__, old_locale));
freelocale(old_locale);
Expand Down

0 comments on commit e72200e

Please sign in to comment.