diff options
Diffstat (limited to 'locale/loadarchive.c')
-rw-r--r-- | locale/loadarchive.c | 10 |
1 files changed, 7 insertions, 3 deletions
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; |