2002-08-20 Jakub Jelinek <jakub@redhat.com>

* locale/loadarchive.c (_nl_load_locale_from_archive): Handle
	partially overlapping mappings.	 Remove unneeded (char *) casts.
	Never allow duplication of ranges in mapped areas.
This commit is contained in:
Roland McGrath 2002-08-20 19:39:58 +00:00
parent 69681bdee0
commit b5560a4483

View File

@ -327,7 +327,8 @@ _nl_load_locale_from_archive (int category, const char **namep)
/* Determine whether the appropriate page is already mapped. */
while (mapped != NULL
&& mapped->from + mapped->len <= ranges[cnt].from)
&& (mapped->from + mapped->len
<= ranges[cnt].from + ranges[cnt].len))
{
last = mapped;
mapped = mapped->next;
@ -336,8 +337,8 @@ _nl_load_locale_from_archive (int category, const char **namep)
/* Do we have a match? */
if (mapped != NULL
&& mapped->from <= ranges[cnt].from
&& ((char *) ranges[cnt].from + ranges[cnt].len
<= (char *) mapped->from + mapped->len))
&& (ranges[cnt].from + ranges[cnt].len
<= mapped->from + mapped->len))
{
/* Yep, already loaded. */
results[ranges[cnt].category].addr = ((char *) mapped->ptr
@ -356,6 +357,9 @@ _nl_load_locale_from_archive (int category, const char **namep)
upper = cnt;
do
{
/* If a range is already mmaped in, stop. */
if (mapped != NULL && ranges[upper].from >= mapped->from)
break;
to = ((ranges[upper].from + ranges[upper].len + ps - 1)
& ~(ps - 1));
++upper;