- Fix _nl_find_msg malloc failure case, and callers. (#959034).
    (cherry picked from e1a168f8a949919f334af7ff83db6339dc1d5190)

Conflicts:
	glibc.spec
This commit is contained in:
Patsy Franklin 2013-05-05 20:19:47 -04:00
parent 3d70261213
commit 22653ae1c2
2 changed files with 87 additions and 2 deletions

80
glibc-rh959034.patch Normal file
View File

@ -0,0 +1,80 @@
2013-05-03 Carlos O'Donell <carlos at redhat.com>
* intl/dcigettext.c (DCIGETTEXT): Skip translating if _nl_find_msg returns -1.
(_nl_find_msg): Return -1 if recursive call returned -1. If newmem is null
return -1.
* intl/loadmsgcat.c (_nl_load_domain): If _nl_find_msg returns -1 abort
loading the domain.
diff --git a/intl/dcigettext.c b/intl/dcigettext.c
index 110307b..f4aa215 100644
--- a/intl/dcigettext.c
+++ b/intl/dcigettext.c
@@ -638,6 +638,11 @@ DCIGETTEXT (domainname, msgid1, msgid2, plural, n, category)
retval = _nl_find_msg (domain->successor[cnt], binding,
msgid1, 1, &retlen);
+ /* Resource problems are not fatal, instead we return no
+ translation. */
+ if (__builtin_expect (retval == (char *) -1, 0))
+ goto no_translation;
+
if (retval != NULL)
{
domain = domain->successor[cnt];
@@ -941,6 +946,11 @@ _nl_find_msg (domain_file, domainbinding, msgid, convert, lengthp)
nullentry =
_nl_find_msg (domain_file, domainbinding, "", 0, &nullentrylen);
+ /* Resource problems are fatal. If we continue onwards we will
+ only attempt to calloc a new conv_tab and fail later. */
+ if (__builtin_expect (nullentry == (char *) -1, 0))
+ return (char *) -1;
+
if (nullentry != NULL)
{
const char *charsetstr;
@@ -1170,10 +1180,14 @@ _nl_find_msg (domain_file, domainbinding, msgid, convert, lengthp)
freemem_size = INITIAL_BLOCK_SIZE;
newmem = (transmem_block_t *) malloc (freemem_size);
# ifdef _LIBC
- /* Add the block to the list of blocks we have to free
- at some point. */
- newmem->next = transmem_list;
- transmem_list = newmem;
+ if (newmem != NULL)
+ {
+ /* Add the block to the list of blocks we have to free
+ at some point. */
+ newmem->next = transmem_list;
+ transmem_list = newmem;
+ }
+ /* Fall through and return -1. */
# endif
}
if (__builtin_expect (newmem == NULL, 0))
diff --git a/intl/loadmsgcat.c b/intl/loadmsgcat.c
index e4b7b38..ac90ed1 100644
--- a/intl/loadmsgcat.c
+++ b/intl/loadmsgcat.c
@@ -1237,7 +1237,7 @@ _nl_load_domain (domain_file, domainbinding)
default:
/* This is an invalid revision. */
invalid:
- /* This is an invalid .mo file. */
+ /* This is an invalid .mo file or we ran out of resources. */
free (domain->malloced);
#ifdef HAVE_MMAP
if (use_mmap)
@@ -1257,6 +1257,11 @@ _nl_load_domain (domain_file, domainbinding)
/* Get the header entry and look for a plural specification. */
nullentry = _nl_find_msg (domain_file, domainbinding, "", 0, &nullentrylen);
+ if (__builtin_expect (nullentry == (char *) -1, 0))
+ {
+ __libc_rwlock_fini (domain->conversions_lock);
+ goto invalid;
+ }
EXTRACT_PLURAL_EXPRESSION (nullentry, &domain->plural, &domain->nplurals);
out:

View File

@ -28,7 +28,7 @@
Summary: The GNU libc libraries
Name: glibc
Version: %{glibcversion}
Release: 31%{?dist}
Release: 32%{?dist}
# GPLv2+ is used in a bunch of programs, LGPLv2+ is used for libraries.
# Things that are linked directly into dynamically linked programs
# and shared libraries (e.g. crt files, lib*_nonshared.a) have an additional
@ -105,6 +105,7 @@ Patch0012: %{name}-stap-libm.patch
# Needs to be sent upstream
Patch0034: %{name}-rh841318.patch
Patch0038: %{name}-rh959034.patch
# Needs to be sent upstream
Patch0043: %{name}-rh832694.patch
@ -483,6 +484,7 @@ rm -rf %{glibcportsdir}
%patch2043 -p1
%patch1052 -p1
%patch1053 -p1
%patch0038 -p1
# On powerpc32, hp timing is only available in power4/power6
# libs, not in base, so pre-power4 dynamic linker is incompatible
@ -1290,8 +1292,11 @@ rm -f *.filelist*
%endif
%changelog
* Sun May 5 2013 Patsy Franklin <pfrankli@redhat.com> - 2.16-32
- Fix _nl_find_msg malloc failure case, and callers. (#959034).
* Tue Apr 30 2013 Patsy Franklin <pfrankli@redhat.com> - 2.16-31
- Update patch (#848748) for xdr request to use XDRMAXNAME and
- Update patch (#848748) for xdr request to use XDRMAXNAME and
XDRMAXRECORD (#892777).
* Sun Mar 17 2013 Carlos O'Donell <carlos@redhat.com> - 2.16-30