[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Bug#902771: texinfo: makeinfo busy looping with Perl 5.28 due to locale handling



Package: texinfo
Version: 6.5.0.dfsg.1-3
Severity: important
Tags: patch
User: debian-perl@lists.debian.org
Usertags: perl-5.28-transition
Control: block 902557 with -1

Dear maintainer,

we noticed in our Perl 5.28 test rebuilds that the build of notmuch
would hang. Investigation showed that makeinfo goes in a busy loop
for certain documents, and I was able to reduce a test case to just
these two lines:

  @documentencoding UTF-8
  @indicateurl{foo}

The hang only happens when makeinfo is run in a non-UTF8 locale.

This is discussed upstream at

 http://lists.gnu.org/archive/html/bug-texinfo/2018-06/msg00029.html

and I've just sent the attached proposed patch there as well.
-- 
Niko Tyni   ntyni@debian.org
>From 9031aefb7f180f718db83aec5e2782079455a32f Mon Sep 17 00:00:00 2001
From: Niko Tyni <ntyni@debian.org>
Date: Sat, 30 Jun 2018 16:51:13 +0100
Subject: [PATCH] Update locale handling for Perl 5.28

Perl 5.28 introduced thread-safe locales, where setlocale()
only affects the locale of the current thread. External code
like mbrtowc(3) isn't aware of this thread specific locale,
so we need to explicitly modify the global one instead.

Without this we could enter a busy loop in xspara__add_next()
(Texinfo::Convert::XSParagraph) for UTF-8 documents when mbrtowc(3)
returned -1.
---
 tp/Texinfo/Convert/XSParagraph/xspara.c | 9 +++++++++
 1 file changed, 9 insertions(+)

diff --git a/tp/Texinfo/Convert/XSParagraph/xspara.c b/tp/Texinfo/Convert/XSParagraph/xspara.c
index 51eea4a..f2d6d1c 100644
--- a/tp/Texinfo/Convert/XSParagraph/xspara.c
+++ b/tp/Texinfo/Convert/XSParagraph/xspara.c
@@ -248,6 +248,11 @@ xspara_init (void)
 
   dTHX;
 
+#if PERL_VERSION > 27 || (PERL_VERSION == 27 && PERL_SUBVERSION > 8)
+  /* needed due to thread-safe locale handling in newer perls */
+  switch_to_global_locale();
+#endif
+
   if (setlocale (LC_CTYPE, "en_US.UTF-8")
       || setlocale (LC_CTYPE, "en_US.utf8"))
     goto success;
@@ -320,6 +325,10 @@ failure:
     {
 success: ;
       free (utf8_locale);
+#if PERL_VERSION > 27 || (PERL_VERSION == 27 && PERL_SUBVERSION > 8)
+      /* needed due to thread-safe locale handling in newer perls */
+      sync_locale();
+#endif
       /*
       fprintf (stderr, "tried to set LC_CTYPE to UTF-8.\n");
       fprintf (stderr, "character encoding is: %s\n",
-- 
2.17.0


Reply to: