This is the mail archive of the
libc-alpha@sourceware.org
mailing list for the glibc project.
Re: [PATCH] locale: don't crash if locale-archive is an empty file
- From: Aurelien Jarno <aurelien at aurel32 dot net>
- To: Carlos O'Donell <carlos at redhat dot com>
- Cc: libc-alpha at sourceware dot org
- Date: Fri, 29 Nov 2013 17:58:04 +0100
- Subject: Re: [PATCH] locale: don't crash if locale-archive is an empty file
- Authentication-results: sourceware.org; auth=none
- References: <1385739561-27038-1-git-send-email-aurelien at aurel32 dot net> <5298C293 dot 4030503 at redhat dot com>
On Fri, Nov 29, 2013 at 11:36:35AM -0500, Carlos O'Donell wrote:
> On 11/29/2013 10:39 AM, Aurelien Jarno wrote:
> > In case of power failure followed by filesystem issues locale-archive
> > can end-up containing all zeros. In that case all calls to setlocale()
> > generate a SIGFPE. This renders a system with a default non-C locale
> > unbootable.
> >
> > Avoid this by ignoring the locale instead of generating a SIGFPE.
> > ---
> > locale/loadarchive.c | 4 ++++
> > 1 file changed, 4 insertions(+)
> >
> > 2013-11-29 Aurelien Jarno <aurelien@aurel32.net>
> >
> > * locale/loadarchive.c (_nl_load_locale_from_archive): Avoid
> > division by 0.
> >
> > diff --git a/locale/loadarchive.c b/locale/loadarchive.c
> > index 70136dc..7cfc498 100644
> > --- a/locale/loadarchive.c
> > +++ b/locale/loadarchive.c
> > @@ -274,6 +274,10 @@ _nl_load_locale_from_archive (int category, const char **namep)
> > namehashtab = (struct namehashent *) ((char *) head
> > + head->namehash_offset);
> >
> > + /* Avoid division by 0 if the file is corrupted. */
> > + if (__builtin_expect (head->namehash_size == 0, 0))
> > + goto close_and_out;
> > +
> > idx = hval % head->namehash_size;
> > incr = 1 + hval % (head->namehash_size - 2);
> >
> >
>
> How did you test this?
I fetched a broken locale-archive from [1] and set the environment
variables LANG="en_IN" and LANGUAGE="en_IN:en" (though I have been able
to reproduce with my default locales setting). Then all coreutils
commands started to SIGFPE (ls, mount, su, grep, etc.).
In installed the fixed version of the libc, and all commands started
to work again.
Cheers,
Aurelien
[1] http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=730336
--
Aurelien Jarno GPG: 1024D/F1BCDB73
aurelien@aurel32.net http://www.aurel32.net