This is the mail archive of the libc-hacker@sources.redhat.com mailing list for the glibc project.
Note that libc-hacker is a closed list. You may look at the archives of this list, but subscription and posting are not open.
Index Nav: | [Date Index] [Subject Index] [Author Index] [Thread Index] | |
---|---|---|
Message Nav: | [Date Prev] [Date Next] | [Thread Prev] [Thread Next] |
Other format: | [Raw text] |
Hi! localedef can create bogus archive if enlarge_archive happens in add_alias and not in add_locale. The problem is that add_locale_to_archive keeps the old locrec_offset accross archive enlargement. Another problem is that add_alias needs to be given exactly the same name as has been passed to add_locale initially, while it passed name unconditionally in the first case and already free'd memory in the second case. 2002-10-22 Jakub Jelinek <jakub@redhat.com> * locale/programs/locarchive.c (add_alias): Change locrec_offset arg into pointer to locrec_offset. (add_locale_to_archive): Adjust callers. Free normalized_name right before returning, not immediately after add_locale, pass it to add_alias if not NULL instead of name. Rename second normalized_name occurence to nnormalized_codeset_name. --- libc/locale/programs/locarchive.c.jj 2002-10-22 15:34:50.000000000 +0200 +++ libc/locale/programs/locarchive.c 2002-10-22 15:34:37.000000000 +0200 @@ -583,8 +583,9 @@ insert_name (struct locarhandle *ah, static void add_alias (struct locarhandle *ah, const char *alias, bool replace, - const char *oldname, uint32_t locrec_offset) + const char *oldname, uint32_t *locrec_offset_p) { + uint32_t locrec_offset = *locrec_offset_p; struct locarhead *head = ah->addr; const size_t name_len = strlen (alias); struct namehashent *namehashent = insert_name (ah, alias, strlen (alias), @@ -607,10 +608,10 @@ add_alias (struct locarhandle *ah, const namehashent = insert_name (ah, oldname, strlen (oldname), true); assert (namehashent->name_offset != 0); assert (namehashent->locrec_offset != 0); - locrec_offset = namehashent->locrec_offset; + *locrec_offset_p = namehashent->locrec_offset; /* Tail call to try the whole thing again. */ - add_alias (ah, alias, replace, oldname, locrec_offset); + add_alias (ah, alias, replace, oldname, locrec_offset_p); return; } @@ -932,9 +933,9 @@ add_locale_to_archive (ah, name, data, r /* This call does the main work. */ locrec_offset = add_locale (ah, normalized_name ?: name, data, replace); - free (normalized_name); if (locrec_offset == 0) { + free (normalized_name); if (mask & XPG_NORM_CODESET) free ((char *) normalized_codeset); return -1; @@ -953,17 +954,19 @@ add_locale_to_archive (ah, name, data, r } *filedata = data[LC_CTYPE].addr; codeset = (char *) filedata + filedata->strindex[_NL_ITEM_INDEX (_NL_CTYPE_CODESET_NAME)]; + char *normalized_codeset_name = NULL; normalized_codeset = _nl_normalize_codeset (codeset, strlen (codeset)); mask |= XPG_NORM_CODESET; - asprintf (&normalized_name, "%s%s%s.%s%s%s", + asprintf (&normalized_codeset_name, "%s%s%s.%s%s%s", language, territory == NULL ? "" : "_", territory ?: "", normalized_codeset, modifier == NULL ? "" : "@", modifier ?: ""); - add_alias (ah, normalized_name, replace, name, locrec_offset); - free (normalized_name); + add_alias (ah, normalized_codeset_name, replace, + normalized_name ?: name, &locrec_offset); + free (normalized_codeset_name); } /* Now read the locale.alias files looking for lines whose @@ -1061,7 +1064,7 @@ add_locale_to_archive (ah, name, data, r && !strcmp (modifier ?: "", rhs_modifier ?: "")) /* We have a winner. */ add_alias (ah, alias, replace, - normalized_name ?: name, locrec_offset); + normalized_name ?: name, &locrec_offset); if (rhs_mask & XPG_NORM_CODESET) free ((char *) rhs_normalized_codeset); } @@ -1083,6 +1086,8 @@ add_locale_to_archive (ah, name, data, r fclose (fp); } + free (normalized_name); + if (mask & XPG_NORM_CODESET) free ((char *) normalized_codeset); Jakub
Index Nav: | [Date Index] [Subject Index] [Author Index] [Thread Index] | |
---|---|---|
Message Nav: | [Date Prev] [Date Next] | [Thread Prev] [Thread Next] |