2002-08-20 Jakub Jelinek <jakub@redhat.com>
authorroland <roland>
Tue, 20 Aug 2002 19:39:58 +0000 (19:39 +0000)
committerroland <roland>
Tue, 20 Aug 2002 19:39:58 +0000 (19:39 +0000)
* 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

index c795971..e32e8c7 100644 (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;