Mercurial > gnulib
changeset 18264:c8568e6342e0
localename-tests: memory allocation fixes
* tests/test-localename.c (test_locale_name)
(test_locale_name_thread): Don't call freelocale on a locale
that was the base of a successful newlocale, as that
results in a double free. Problem reported by Assaf Gordon.
(test_locale_name_thread): Free saved names after use, to pacify
gcc -fsanitize=address.
author | Paul Eggert <eggert@cs.ucla.edu> |
---|---|
date | Sun, 13 Mar 2016 22:44:58 -0700 |
parents | 273589d5bdbf |
children | 4a112f0aa5a8 |
files | ChangeLog tests/test-localename.c |
diffstat | 2 files changed, 20 insertions(+), 5 deletions(-) [+] |
line wrap: on
line diff
--- a/ChangeLog Tue Mar 08 16:35:58 2016 -0800 +++ b/ChangeLog Sun Mar 13 22:44:58 2016 -0700 @@ -1,3 +1,13 @@ +2016-03-13 Paul Eggert <eggert@cs.ucla.edu> + + localename-tests: memory allocation fixes + * tests/test-localename.c (test_locale_name) + (test_locale_name_thread): Don't call freelocale on a locale + that was the base of a successful newlocale, as that + results in a double free. Problem reported by Assaf Gordon. + (test_locale_name_thread): Free saved names after use, to pacify + gcc -fsanitize=address. + 2016-03-08 Paul Eggert <eggert@cs.ucla.edu> intprops: make .h file license match module
--- a/tests/test-localename.c Tue Mar 08 16:35:58 2016 -0800 +++ b/tests/test-localename.c Sun Mar 13 22:44:58 2016 -0700 @@ -200,7 +200,9 @@ if (loc != NULL) { locale_t locale = newlocale (category_mask, "de_DE.UTF-8", loc); - if (locale != NULL) + if (locale == NULL) + freelocale (loc); + else { unsigned int j; @@ -217,7 +219,6 @@ uselocale (LC_GLOBAL_LOCALE); freelocale (locale); } - freelocale (loc); } } } @@ -267,7 +268,9 @@ if (loc != NULL) { locale_t locale = newlocale (category_mask, "de_DE.UTF-8", loc); - if (locale != NULL) + if (locale == NULL) + freelocale (loc); + else { unsigned int j; @@ -285,7 +288,6 @@ uselocale (LC_GLOBAL_LOCALE); freelocale (locale); } - freelocale (loc); } } } @@ -464,7 +466,10 @@ unsigned int i; for (i = 0; i < SIZEOF (categories); i++) - ASSERT (strcmp (unsaved_names[j][i], saved_names[j][i]) == 0); + { + ASSERT (strcmp (unsaved_names[j][i], saved_names[j][i]) == 0); + free (saved_names[j][i]); + } } } #else