]> code.citadel.org Git - citadel.git/blobdiff - libcitadel/lib/hash.c
* off by one in range checking of indexed access
[citadel.git] / libcitadel / lib / hash.c
index f9ceeced3d82fe94cd282c56d7d970af5f24ff81..bd22f10a8f35df74d5c1a58e68c7a1e379f7ff38 100644 (file)
@@ -651,8 +651,8 @@ int DeleteEntryFromHash(HashList *Hash, HashPos *At)
                return 0;
        }
 
-       FreeMe = Hash->Members[At->Position];
-       Hash->Members[At->Position] = NULL;
+       FreeMe = Hash->Members[Hash->LookupTable[At->Position]->Position];
+       Hash->Members[Hash->LookupTable[At->Position]->Position] = NULL;
 
 
        /** delete our hashing data */
@@ -667,6 +667,7 @@ int DeleteEntryFromHash(HashList *Hash, HashPos *At)
                                (Hash->nLookupTableItems - At->Position - 1) * 
                                sizeof(HashKey*));
 
+                       Hash->LookupTable[Hash->nLookupTableItems - 1] = NULL;
                }
                else 
                        Hash->LookupTable[At->Position] = NULL;
@@ -810,7 +811,7 @@ int GetHashAt(HashList *Hash,long At, long *HKLen, const char **HashKey, void **
 
        if ((Hash == NULL) || 
            (At < 0) || 
-           (At > Hash->nLookupTableItems))
+           (At >= Hash->nLookupTableItems))
                return 0;
        *HKLen = Hash->LookupTable[At]->HKLen;
        *HashKey = Hash->LookupTable[At]->HashKey;
@@ -954,15 +955,6 @@ void SortByPayload(HashList *Hash, CompareFunc SortBy)
  */
 
 
-/*
- * Generic function to free a pointer.  This can be used as a callback with the
- * hash table, even on systems where free() is defined as a macro or has had other
- * horrible things done to it.
- */
-void generic_free_handler(void *ptr) {
-       free(ptr);
-}
-
 /*
  * Generic function to free a reference.  
  * since a reference actualy isn't needed to be freed, do nothing.