From d0050b1bea9bb8ede55ed360ec5fb7131d195e0c Mon Sep 17 00:00:00 2001 From: simonmar Date: Fri, 8 Oct 2004 10:28:37 +0000 Subject: [PATCH] [project @ 2004-10-08 10:28:37 by simonmar] - make sure we don't overflow the table - use a checked array index just in case we *do* try to overflow - fix a harmless off-by-one --- Data/HashTable.hs | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/Data/HashTable.hs b/Data/HashTable.hs index b392ce2..39fc93c 100644 --- a/Data/HashTable.hs +++ b/Data/HashTable.hs @@ -187,7 +187,7 @@ new new cmp hash_fn = do -- make a new hash table with a single, empty, segment - dir <- newIOArray (0,dIR_SIZE) undefined + dir <- newIOArray (0,dIR_SIZE-1) undefined segment <- newIOArray (0,sEGMENT_SIZE-1) [] myWriteArray dir 0 segment @@ -271,9 +271,15 @@ expandHashTable newsegment = newbucket `shiftR` sEGMENT_SHIFT newindex = newbucket .&. sEGMENT_MASK -- + if newsegment >= dIR_SIZE -- make sure we don't overflow the table. + then return table + else do + -- when (newindex == 0) $ do segment <- newIOArray (0,sEGMENT_SIZE-1) [] - myWriteArray dir newsegment segment + writeIOArray dir newsegment segment + -- doesn't happen very often, so we might as well use a safe + -- array index here. -- let table' = if (split+1) < max -- 1.7.10.4