about summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--locale/loadarchive.c11
1 files changed, 9 insertions, 2 deletions
diff --git a/locale/loadarchive.c b/locale/loadarchive.c
index 845b9b0774..d71ec88e8c 100644
--- a/locale/loadarchive.c
+++ b/locale/loadarchive.c
@@ -68,7 +68,7 @@ static struct stat64 archive_stat; /* stat of archive when header mapped.  */
 struct locale_in_archive
 {
   struct locale_in_archive *next;
-  const char *name;
+  char *name;
   struct locale_data *data[__LC_LAST];
 };
 static struct locale_in_archive *archloaded;
@@ -428,7 +428,13 @@ _nl_load_locale_from_archive (int category, const char **namep)
   if (__builtin_expect (lia == NULL, 0))
     return NULL;
 
-  lia->name = headmap.ptr + namehashtab[idx].name_offset;
+  lia->name = strdup (*namep);
+  if (__builtin_expect (lia->name == NULL, 0))
+    {
+      free (lia);
+      return NULL;
+    }
+
   lia->next = archloaded;
   archloaded = lia;
 
@@ -464,6 +470,7 @@ _nl_archive_subfreeres (void)
       struct locale_in_archive *dead = lia;
       lia = lia->next;
 
+      free (dead->name);
       for (category = 0; category < __LC_LAST; ++category)
 	if (category != LC_ALL)
 	  /* _nl_unload_locale just does this free for the archive case.  */