From b5560a4483a8dad8ea53fca08203f581a6507121 Mon Sep 17 00:00:00 2001 From: Roland McGrath Date: Tue, 20 Aug 2002 19:39:58 +0000 Subject: 2002-08-20 Jakub Jelinek * locale/loadarchive.c (_nl_load_locale_from_archive): Handle partially overlapping mappings. Remove unneeded (char *) casts. Never allow duplication of ranges in mapped areas. --- locale/loadarchive.c | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) (limited to 'locale/loadarchive.c') diff --git a/locale/loadarchive.c b/locale/loadarchive.c index c795971894..e32e8c7648 100644 --- a/locale/loadarchive.c +++ b/locale/loadarchive.c @@ -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; -- cgit 1.4.1