* locale/programs/locarchive.c (open_archive): Map the entire file

and not just the administrative data.
	(add_locale): When we find a hash sum match compare the content
	to be sure.
This commit is contained in:
Ulrich Drepper 2009-04-18 12:12:33 +00:00
parent 0588a9cb62
commit 59a7162b17
2 changed files with 36 additions and 9 deletions

View File

@ -1,5 +1,10 @@
2009-04-18 Ulrich Drepper <drepper@redhat.com> 2009-04-18 Ulrich Drepper <drepper@redhat.com>
* locale/programs/locarchive.c (open_archive): Map the entire file
and not just the administrative data.
(add_locale): When we find a hash sum match compare the content
to be sure.
* malloc/malloc.c (malloc_info): Output address space information. * malloc/malloc.c (malloc_info): Output address space information.
2009-04-17 Ulrich Drepper <drepper@redhat.com> 2009-04-17 Ulrich Drepper <drepper@redhat.com>

View File

@ -1,4 +1,4 @@
/* Copyright (C) 2002, 2003, 2005, 2007 Free Software Foundation, Inc. /* Copyright (C) 2002, 2003, 2005, 2007, 2009 Free Software Foundation, Inc.
This file is part of the GNU C Library. This file is part of the GNU C Library.
Contributed by Ulrich Drepper <drepper@redhat.com>, 2002. Contributed by Ulrich Drepper <drepper@redhat.com>, 2002.
@ -380,7 +380,7 @@ enlarge_archive (struct locarhandle *ah, const struct locarhead *head)
= ((char *) ah->addr = ((char *) ah->addr
+ oldnamehashtab[oldlocrecarray[cnt - 1].cnt].name_offset); + oldnamehashtab[oldlocrecarray[cnt - 1].cnt].name_offset);
add_alias (&new_ah, add_alias (&new_ah,
((char *) ah->addr ((char *) ah->addr
+ oldnamehashtab[oldlocrecarray[cnt].cnt].name_offset), + oldnamehashtab[oldlocrecarray[cnt].cnt].name_offset),
0, oldname, &last_locrec_offset); 0, oldname, &last_locrec_offset);
@ -517,9 +517,9 @@ open_archive (struct locarhandle *ah, bool readonly)
ah->len = (head.sumhash_offset ah->len = (head.sumhash_offset
+ head.sumhash_size * sizeof (struct sumhashent)); + head.sumhash_size * sizeof (struct sumhashent));
/* Now we know how large the administrative information part is. /* Map the entire file. We might need to compare the category data
Map all of it. */ in the file with the newly added data. */
ah->addr = mmap64 (NULL, ah->len, PROT_READ | (readonly ? 0 : PROT_WRITE), ah->addr = mmap64 (NULL, st.st_size, PROT_READ | (readonly ? 0 : PROT_WRITE),
MAP_SHARED, fd, 0); MAP_SHARED, fd, 0);
if (ah->addr == MAP_FAILED) if (ah->addr == MAP_FAILED)
{ {
@ -760,10 +760,32 @@ add_locale (struct locarhandle *ah,
{ {
if (memcmp (data[cnt].sum, sumhashtab[idx].sum, 16) == 0) if (memcmp (data[cnt].sum, sumhashtab[idx].sum, 16) == 0)
{ {
/* Found it. */ /* Check the content, there could be a collision of
file_offsets[cnt] = sumhashtab[idx].file_offset; the hash sum.
--num_new_offsets;
break; Unfortunately the sumhashent record does not include
the size of the stored data. So we have to search for
it. */
locrecent = (struct locrecent *) ((char *) ah->addr
+ head->locrectab_offset);
size_t iloc;
for (iloc = 0; iloc < head->locrectab_used; ++iloc)
if (locrecent[iloc].refs != 0
&& (locrecent[iloc].record[cnt].offset
== sumhashtab[idx].file_offset))
break;
if (iloc != head->locrectab_used
&& data[cnt].size == locrecent[iloc].record[cnt].len
&& memcmp (data[cnt].addr,
(char *) ah->addr + sumhashtab[idx].file_offset,
data[cnt].size) == 0)
{
/* Found it. */
file_offsets[cnt] = sumhashtab[idx].file_offset;
--num_new_offsets;
break;
}
} }
idx += incr; idx += incr;