From c2d5bd5b00cfbb0ef192821f2d724fb6448d59e3 Mon Sep 17 00:00:00 2001 From: Ulrich Drepper Date: Fri, 24 Apr 2009 18:20:10 +0000 Subject: [BZ #10100] 2009-04-24 Ulrich Drepper [BZ #10100] * misc/hsearch_r.c (hsearch_r): Add back ensurance that hval is not zero. --- ChangeLog | 6 ++++++ locale/programs/locarchive.c | 27 ++++++++++++--------------- misc/hsearch_r.c | 2 ++ 3 files changed, 20 insertions(+), 15 deletions(-) diff --git a/ChangeLog b/ChangeLog index 70c7e48..2ea0108 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,9 @@ +2009-04-24 Ulrich Drepper + + [BZ #10100] + * misc/hsearch_r.c (hsearch_r): Add back ensurance that hval is + not zero. + 2009-04-24 Jakub Jelinek * iconvdata/sjis.c (BODY): Don't advance inptr before diff --git a/locale/programs/locarchive.c b/locale/programs/locarchive.c index 02f89de..66c5d39 100644 --- a/locale/programs/locarchive.c +++ b/locale/programs/locarchive.c @@ -131,14 +131,12 @@ create_archive (const char *archivefname, struct locarhandle *ah) /* To prepare for enlargements of the mmaped area reserve some address space. */ - size_t reserved; + size_t reserved = RESERVE_MMAP_SIZE; int xflags = 0; - p = mmap64 (NULL, RESERVE_MMAP_SIZE, PROT_NONE, MAP_ANON, -1, 0); - if (p != MAP_FAILED) - { - xflags = MAP_FIXED; - reserved = RESERVE_MMAP_SIZE; - } + if (total < RESERVE_MMAP_SIZE + && ((p = mmap64 (NULL, reserved, PROT_NONE, MAP_ANON, -1, 0)) + != MAP_FAILED)) + xflags = MAP_FIXED; else { p = NULL; @@ -580,14 +578,13 @@ open_archive (struct locarhandle *ah, bool readonly) /* To prepare for enlargements of the mmaped area reserve some address space. */ - size_t reserved; + size_t reserved = RESERVE_MMAP_SIZE; int xflags = 0; - void *p = mmap64 (NULL, RESERVE_MMAP_SIZE, PROT_NONE, MAP_ANON, -1, 0); - if (p != MAP_FAILED) - { - xflags = MAP_FIXED; - reserved = RESERVE_MMAP_SIZE; - } + void *p; + if (st.st_size < RESERVE_MMAP_SIZE + && ((p = mmap64 (NULL, RESERVE_MMAP_SIZE, PROT_NONE, MAP_ANON, -1, 0)) + != MAP_FAILED)) + xflags = MAP_FIXED; else { p = NULL; @@ -612,7 +609,7 @@ close_archive (struct locarhandle *ah) { if (ah->fd != -1) { - munmap (ah->addr, ah->mmaped); + munmap (ah->addr, MAX (ah->reserved, ah->mmaped)); close (ah->fd); } } diff --git a/misc/hsearch_r.c b/misc/hsearch_r.c index 6e32afc..73b9565 100644 --- a/misc/hsearch_r.c +++ b/misc/hsearch_r.c @@ -157,6 +157,8 @@ hsearch_r (item, action, retval, htab) hval <<= 4; hval += item.key[count]; } + if (hval == 0) + ++hval; /* First hash function: simply take the modul but prevent zero. */ idx = hval % htab->size + 1; -- cgit v1.1