From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mout.kundenserver.de (mout.kundenserver.de [217.72.192.74]) by sourceware.org (Postfix) with ESMTPS id 468653856DD2; Thu, 11 Aug 2022 17:35:41 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.1 sourceware.org 468653856DD2 Authentication-Results: sourceware.org; dmarc=fail (p=none dis=none) header.from=cygwin.com Authentication-Results: sourceware.org; spf=fail smtp.mailfrom=cygwin.com Received: from calimero.vinschen.de ([24.134.7.25]) by mrelayeu.kundenserver.de (mreue106 [212.227.15.183]) with ESMTPSA (Nemesis) id 1MMWgb-1o3prY3fVv-00JctK; Thu, 11 Aug 2022 19:35:39 +0200 Received: by calimero.vinschen.de (Postfix, from userid 500) id 25D5FA80B75; Thu, 11 Aug 2022 19:35:39 +0200 (CEST) Date: Thu, 11 Aug 2022 19:35:39 +0200 From: Corinna Vinschen To: cygwin@cygwin.com, newlib@sourceware.org Subject: Re: crash in newlocale() Message-ID: Reply-To: cygwin@cygwin.com Mail-Followup-To: cygwin@cygwin.com, newlib@sourceware.org References: <20220811211806.bc7f5426ce52f57d1c1538c2@nifty.ne.jp> MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Disposition: inline In-Reply-To: <20220811211806.bc7f5426ce52f57d1c1538c2@nifty.ne.jp> X-Provags-ID: V03:K1:rMjqZXw3O3FzLOjWgEXilK1xav4uDyu/CXDerr+RlU8128naFSD 4A9Pa++kqtUb/7hPVjb1aER/hlFAgN2ehIb8/Kk/EsAlkxlsXYkUjMi4+ucVBSBxt6ItWIe itxfUZKm4Fbr2Sy0/hZ/8Y1G0xx+xvADYHzSGse//ZKt7bg9vOWy3812kjcBi/gJMiRiYTD 0lLr+F/ZGzC9hcz0qcDVw== X-UI-Out-Filterresults: notjunk:1;V03:K0:WGWP/MHA19o=:zPy86E3RTor4pNf3OUftPD HW4X5/iYoyid35N1whl3VqhLQ0cYwYWqVjZM2CYC9EKlumLCh2mMJmutpg93CzRUlE4FDh+GV TJ4lW4CnZcsj8LLbxQAJoGmBELkXdC3n1jFe5hC7sKGXvY1/areoTLlnwIeyPaIBlPo10yOxl KgsxxF7a+zWZymfWnRRZKuK3wwmVMVBKRWCv8+Bkji25tseZVsJVbIsiqj2KOCDdRfNGiZ5zo N5VYz74d3qSccjdULCRlf/qxPujKXpw1Bh0aPNk9hAOWa/jBRNzas8ctycCzaWVwJiuKwZ9Sf ixEnaetrgLmj8NVwhcGjLIbrkEVElab7e/0ZG0d7jj62lsfpYXFmAei0vyXkkg2a2AIQj4XNF saY+s8Teb3iJk37uYpQw1ZrNahfyOQ8l9YoW8vgZUXUDyuIQwC+dLYPvLpngFaySO1hVoCz/S MzFUfHydPcgh2Om9zy9rh5eq6+naMSKZG2vmeoTBHNB2SxXTH3xKDEf13Fj8TsimbPePfkPwl 0TkwzkU3X6R5UfAX9Yyqvkxx3BqGUKTXIcC3K5V+yq+Q0CbQILfx8x9SN8ZePC7Kkj9nmYOhA t7RAPkaL5HOK6SvvuVXke+oWj0UZJS40NRWqvGQoRmTK9ge4GmULKBEBP0qDt+bEGoCKP51e/ emyrYSINEVUt/rzchS+BHZ+u3RrZCaNamOelctqpQZGi4sVS3fxvIelroS5IqVNwyprwlEKVU lhsEBH1e97WxFau+CzfMj4Tw6V1DJZXCvinkNaKYxLy/BhmY8OufnLHM4+o= X-Spam-Status: No, score=-101.8 required=5.0 tests=BAYES_00, GIT_PATCH_0, GOOD_FROM_CORINNA_CYGWIN, KAM_DMARC_NONE, KAM_DMARC_STATUS, RCVD_IN_DNSWL_NONE, RCVD_IN_MSPIKE_H2, SPF_FAIL, SPF_HELO_NONE, 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@cygwin.com X-Mailman-Version: 2.1.29 Precedence: list List-Id: General Cygwin discussions and problem reports List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Thu, 11 Aug 2022 17:35:43 -0000 On Aug 11 21:18, Takashi Yano wrote: > 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: > > [...] > > 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. */ I think the right thing to do is to avoid freeing this data, if the base locale is the C locale. I sent a patch to cygwin-patches for review. Can you please take a look? Thanks, Corinna