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