You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
80 lines
3.0 KiB
80 lines
3.0 KiB
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 glibc-2.17-c758a686/intl/dcigettext.c glibc-2.17-c758a686/intl/dcigettext.c |
|
index 110307b..f4aa215 100644 |
|
--- glibc-2.17-c758a686/intl/dcigettext.c |
|
+++ glibc-2.17-c758a686/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 glibc-2.17-c758a686/intl/loadmsgcat.c glibc-2.17-c758a686/intl/loadmsgcat.c |
|
index e4b7b38..ac90ed1 100644 |
|
--- glibc-2.17-c758a686/intl/loadmsgcat.c |
|
+++ glibc-2.17-c758a686/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:
|
|
|