From: Roland McGrath Date: Tue, 20 Aug 2002 19:39:58 +0000 (+0000) Subject: 2002-08-20 Jakub Jelinek X-Git-Tag: cvs/glibc-2-3~436 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=b5560a4483a8dad8ea53fca08203f581a6507121;p=platform%2Fupstream%2Fglibc.git 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. --- diff --git a/locale/loadarchive.c b/locale/loadarchive.c index c795971..e32e8c7 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;