Re: crash in newlocale()

Corinna Vinschen <[email protected]>
Newsgroups gmane.comp.lib.newlib
Message-ID <YvU+x4kBsjdbA/[email protected]>
On Aug 11 19:35, Corinna Vinschen wrote:
> 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?

Resent to the newlib list where it belongs, d'oh.


Corinna
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.