Mail Archives: cygwin/2022/08/11/08:20:30
X-Recipient: | archive-cygwin AT delorie DOT com
|
X-Original-To: | cygwin AT cygwin DOT com
|
Delivered-To: | cygwin AT cygwin DOT com
|
DMARC-Filter: | OpenDMARC Filter v1.4.1 sourceware.org 9523E3857824
|
Authentication-Results: | sourceware.org;
|
| dmarc=fail (p=none dis=none) header.from=nifty.ne.jp
|
Authentication-Results: | sourceware.org; spf=fail smtp.mailfrom=nifty.ne.jp
|
DKIM-Filter: | OpenDKIM Filter v2.10.3 conssluserg-04.nifty.com 27BCI5rk006362
|
DKIM-Signature: | v=1; a=rsa-sha256; c=relaxed/relaxed; d=nifty.ne.jp;
|
| s=dec2015msa; t=1660220286;
|
| bh=n7L2qWN+QaHACd2a16pXEpQjvoO1jgyAo7yMM5752oQ=;
|
| h=Date:From:To:Cc:Subject:In-Reply-To:References:From;
|
| b=t8LJEbkkygUCNmKn1FIJEvvywrChVxzats64N8bN2QxeR3BPGANUOe6z/76uriuYW
|
| yFx6UZpwe97T/otoaq5uJ4tv9BRNdPDjndvLpVxlezhcYG1vWa4zy4439O0EeyaZbX
|
| XJjvUfyWhzsoU1QrgFKLoU6l4XojUhWPyfEPDcaza2LNxRrHT3IPgpkDUYA5pln5V4
|
| v8Nin7zoX7AJD2LMEtuwaVuzUwtwl89bRCxTv5BnHk4zm4iSmv8fCUtCTd1u00Hjby
|
| FEGMgfW6xBLmfUbWc940zFBMKbUNruVnjokvz1Hm9PNjybDdoxXzRoHNRfJ/be/OgG
|
| AnAOgeEaJHYkA==
|
X-Nifty-SrcIP: | [220.150.135.236]
|
Date: | Thu, 11 Aug 2022 21:18:06 +0900
|
From: | Takashi Yano <takashi DOT yano AT nifty DOT ne DOT jp>
|
To: | cygwin AT cygwin DOT com
|
Subject: | Re: crash in newlocale()
|
Message-Id: | <20220811211806.bc7f5426ce52f57d1c1538c2@nifty.ne.jp>
|
In-Reply-To: | <YvRbeAzxwtYwhkkE@venus.tony.develop-help.com>
|
References: | <YvRbeAzxwtYwhkkE AT venus DOT tony DOT develop-help DOT com>
|
X-Mailer: | Sylpheed 3.7.0 (GTK+ 2.24.30; i686-pc-mingw32)
|
Mime-Version: | 1.0
|
X-Spam-Status: | No, score=-11.4 required=5.0 tests=BAYES_00, DKIM_SIGNED,
|
| DKIM_VALID, DKIM_VALID_AU, DKIM_VALID_EF, GIT_PATCH_0, KAM_SHORT, NICE_REPLY_A,
|
| RCVD_IN_DNSWL_NONE, SPF_HELO_NONE, SPF_PASS, TXREP,
|
| T_SCC_BODY_TEXT_LINE autolearn=ham autolearn_force=no version=3.4.6
|
X-Spam-Checker-Version: | SpamAssassin 3.4.6 (2021-04-09) on
|
| server2.sourceware.org
|
X-BeenThere: | cygwin AT cygwin DOT com
|
X-Mailman-Version: | 2.1.29
|
List-Id: | General Cygwin discussions and problem reports <cygwin.cygwin.com>
|
List-Unsubscribe: | <https://cygwin.com/mailman/options/cygwin>,
|
| <mailto:cygwin-request AT cygwin DOT com?subject=unsubscribe>
|
List-Archive: | <https://cygwin.com/pipermail/cygwin/>
|
List-Post: | <mailto:cygwin AT cygwin DOT com>
|
List-Help: | <mailto:cygwin-request AT cygwin DOT com?subject=help>
|
List-Subscribe: | <https://cygwin.com/mailman/listinfo/cygwin>,
|
| <mailto:cygwin-request AT cygwin DOT com?subject=subscribe>
|
Cc: | newlib AT sourceware DOT org
|
Errors-To: | cygwin-bounces+archive-cygwin=delorie DOT com AT cygwin DOT com
|
Sender: | "Cygwin" <cygwin-bounces+archive-cygwin=delorie DOT com AT cygwin DOT com>
|
On Thu, 11 Aug 2022 11:29:28 +1000
Tony Cook wrote:
> Hello everyone,
>
> While tracking down a crash in development versions of perl the boostrap
> miniperl executable was crashing early in the build process:
>
> $ gdb --args ./miniperl -e0
> GNU gdb (GDB) (Cygwin 11.2-1) 11.2
> Copyright (C) 2022 Free Software Foundation, Inc.
> License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
> This is free software: you are free to change and redistribute it.
> There is NO WARRANTY, to the extent permitted by law.
> Type "show copying" and "show warranty" for details.
> This GDB was configured as "x86_64-pc-cygwin".
> Type "show configuration" for configuration details.
> For bug reporting instructions, please see:
> <https://www.gnu.org/software/gdb/bugs/>.
> Find the GDB manual and other documentation resources online at:
> <http://www.gnu.org/software/gdb/documentation/>.
>
> For help, type "help".
> Type "apropos word" to search for commands related to "word"...
> Reading symbols from ./miniperl...
> (gdb) b locale.c:1154
> Breakpoint 1 at 0x10077db13: file locale.c, line 1154.
> (gdb) r
> Starting program: /home/tony/dev/perl/git/perl/miniperl -e0
> [New Thread 13624.0x1c7c]
> [New Thread 13624.0x1978]
> [New Thread 13624.0x2958]
> [New Thread 13624.0x3374]
>
> Thread 1 "miniperl" hit Breakpoint 1, S_emulate_setlocale_i (my_perl=0x800049910, index=0, new_locale=0x800066628 "en_US.UTF-8", recalc_LC_ALL=-1, line=4026) at locale.c:1154
> 1154 new_obj = newlocale(mask, new_locale, basis_obj);
> (gdb) bt
> #0 S_emulate_setlocale_i (my_perl=0x800049910, index=0,
> new_locale=0x800066628 "en_US.UTF-8", recalc_LC_ALL=-1, line=4026)
> at locale.c:1154
> #1 0x0000000100783849 in Perl_init_i18nl10n (my_perl=0x800049910, printwarn=1)
> at locale.c:4026
> #2 0x0000000100443c80 in perl_construct (my_perl=0x800049910)
> at /home/tony/dev/perl/git/perl/perl.c:447
> #3 0x00000001007b7483 in main (argc=2, argv=0xffffcc30, env=0x8000281a0)
> at miniperlmain.c:108
> (gdb) p mask
> $1 = 4
> (gdb) p new_locale
> $2 = 0x800066628 "en_US.UTF-8"
> (gdb) p basis_obj
> $3 = (locale_t) 0x1802b3060 <__C_locale>
> (gdb) n
>
> Thread 1 "miniperl" received signal SIGSEGV, Segmentation fault.
> 0x000000080004a310 in ?? ()
> (gdb) bt
> #0 0x000000080004a310 in ?? ()
> Backtrace stopped: previous frame identical to this frame (corrupt stack?)
> (gdb)
>
> While I get a SEGV from miniperl, a simple reproducer returns a
> SIGTRAP:
>
> tony AT enceladus ~/dev/perl/git
> $ cat newlocale-test.c
> #include <locale.h>
> #include <stdio.h>
>
> int main() {
> locale_t st = newlocale(LC_ALL_MASK, "C", (locale_t)0);
>
> locale_t st2 = newlocale(LC_CTYPE_MASK, "en_US.UTF-8", st);
> printf("Done\n");
> return 0;
> }
> tony AT enceladus ~/dev/perl/git
> $ gcc -onewlocale-test -g newlocale-test.c
>
> tony AT enceladus ~/dev/perl/git
> $ gdb ./newlocale-test.exe
> GNU gdb (GDB) (Cygwin 11.2-1) 11.2
> Copyright (C) 2022 Free Software Foundation, Inc.
> License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
> This is free software: you are free to change and redistribute it.
> There is NO WARRANTY, to the extent permitted by law.
> Type "show copying" and "show warranty" for details.
> This GDB was configured as "x86_64-pc-cygwin".
> Type "show configuration" for configuration details.
> For bug reporting instructions, please see:
> <https://www.gnu.org/software/gdb/bugs/>.
> Find the GDB manual and other documentation resources online at:
> <http://www.gnu.org/software/gdb/documentation/>.
>
> For help, type "help".
> Type "apropos word" to search for commands related to "word"...
> Reading symbols from ./newlocale-test.exe...
> (gdb) r
> Starting program: /home/tony/dev/perl/git/newlocale-test.exe
> [New Thread 9176.0x3a8c]
> [New Thread 9176.0x2014]
> [New Thread 9176.0x2bc4]
> [Thread 9176.0x2014 exited with code 3221225477]
> [Thread 9176.0x3a8c exited with code 3221225477]
> [Thread 9176.0x2bc4 exited with code 3221225477]
>
> Program terminated with signal SIGTRAP, Trace/breakpoint trap.
> The program no longer exists.
> (gdb) b main
> Breakpoint 1 at 0x10040108d: file newlocale-test.c, line 5.
> (gdb) r
> Starting program: /home/tony/dev/perl/git/newlocale-test.exe
> [New Thread 13668.0x2a7c]
> [New Thread 13668.0x15a0]
> [New Thread 13668.0x2158]
>
> Thread 1 "newlocale-test" hit Breakpoint 1, main () at newlocale-test.c:5
> 5 locale_t st = newlocale(LC_ALL_MASK, "C", (locale_t)0);
> (gdb) n
> 7 locale_t st2 = newlocale(LC_CTYPE_MASK, "en_US.UTF-8", st);
> (gdb)
> [Thread 13668.0x2158 exited with code 3221225477]
> [Thread 13668.0x35d0 exited with code 3221225477]
> [Thread 13668.0x2a7c exited with code 3221225477]
>
> Program terminated with signal SIGTRAP, Trace/breakpoint trap.
> The program no longer exists.
> (gdb)
I looked into this problem and found the access violation
occurs at:
newlib/libc/locale/newlocale.c
@@ 188,7 @@ _newlocale_r (struct _reent *p, int category_mask, const char *locale,
if (tmp_locale.lc_cat[i].buf == (const void *) -1)
{
tmp_locale.lc_cat[i].buf = base->lc_cat[i].buf;
base->lc_cat[i].ptr = base->lc_cat[i].buf = NULL; <-- Here!!!
}
#endif /* __HAVE_LOCALE_INFO__ */
_freelocale_r (p, base);
This is because
locale_t st = newlocale(LC_ALL_MASK, "C", (locale_t)0);
returns
extern const struct __locale_t __C_locale;
return (struct __locale_t *) &__C_locale;
, which is in the const area that cannot be modified.
This seems to be a newlib bug.
I also found following patch solves the issue.
diff --git a/newlib/libc/locale/newlocale.c b/newlib/libc/locale/newlocale.c
index 0789d5fd9..1974665ec 100644
--- a/newlib/libc/locale/newlocale.c
+++ b/newlib/libc/locale/newlocale.c
@@ -108,10 +108,12 @@ _newlocale_r (struct _reent *p, int category_mask, const char *locale,
}
/* If the new locale is supposed to be all default locale, just return
a pointer to the default locale. */
+#if 0
if ((!base && category_mask == 0)
|| (category_mask == LC_VALID_MASK
&& (!strcmp (locale, "C") || !strcmp (locale, "POSIX"))))
return __get_C_locale ();
+#endif
/* Start with setting all values to the default locale values. */
tmp_locale = *__get_C_locale ();
/* Fill out new category strings. */
--
Takashi Yano <takashi DOT yano AT nifty DOT ne DOT jp>
--
Problem reports: https://cygwin.com/problems.html
FAQ: https://cygwin.com/faq/
Documentation: https://cygwin.com/docs.html
Unsubscribe info: https://cygwin.com/ml/#unsubscribe-simple
- Raw text -