*/
struct SilcIDCacheListStruct {
- SilcIDCacheEntry cache[64];
+ SilcIDCacheEntry cache[128];
SilcIDCacheEntry *cache_dyn;
SilcUInt32 cache_dyn_count;
SilcUInt32 cache_count;
SILC_LOG_DEBUG(("Allocating new cache"));
cache = silc_calloc(1, sizeof(*cache));
- cache->id_table = silc_hash_table_alloc(count, silc_hash_id,
+ if (!cache)
+ return NULL;
+ cache->id_table = silc_hash_table_alloc(count, silc_hash_id,
(void *)(SilcUInt32)id_type,
- silc_hash_id_compare,
- (void *)(SilcUInt32)id_type,
- silc_idcache_destructor, NULL,
- FALSE);
+ silc_hash_id_compare,
+ (void *)(SilcUInt32)id_type,
+ silc_idcache_destructor, NULL, TRUE);
cache->name_table = silc_hash_table_alloc(count, silc_hash_string, NULL,
- silc_hash_string_compare, NULL,
- NULL, NULL, FALSE);
+ silc_hash_string_compare, NULL,
+ NULL, NULL, TRUE);
cache->context_table = silc_hash_table_alloc(count, silc_hash_ptr, NULL,
- NULL, NULL, NULL, NULL, FALSE);
+ NULL, NULL, NULL, NULL, TRUE);
cache->destructor = destructor;
cache->type = id_type;
+ if (!cache->id_table || !cache->name_table || !cache->context_table) {
+ if (cache->id_table)
+ silc_hash_table_free(cache->id_table);
+ if (cache->name_table)
+ silc_hash_table_free(cache->name_table);
+ if (cache->context_table)
+ silc_hash_table_free(cache->context_table);
+ silc_free(cache);
+ return NULL;
+ }
+
return cache;
}
/* Allocate new cache entry */
c = silc_calloc(1, sizeof(*c));
+ if (!c)
+ return FALSE;
c->id = id;
c->name = name;
c->expire = expire;
if (context)
silc_hash_table_add(cache->context_table, context, c);
- /* See whether we have time to rehash the tables */
- if ((silc_hash_table_count(cache->id_table) / 2) >
- silc_hash_table_size(cache->id_table)) {
- silc_hash_table_rehash(cache->id_table, 0);
- silc_hash_table_rehash(cache->name_table, 0);
- silc_hash_table_rehash(cache->context_table, 0);
- }
-
if (ret)
*ret = c;
static void silc_idcache_destructor(void *key, void *context,
void *user_context)
{
- silc_free(context);
+ SilcIDCacheEntry c = context;
+ if (c) {
+ memset(c, 'F', sizeof(*c));
+ silc_free(c);
+ }
}
/* Delete cache entry from cache. */
if (old->id)
ret = silc_hash_table_del(cache->id_table, old->id);
else
- silc_free(old);
+ silc_idcache_destructor(NULL, old, NULL);
return ret;
}
if (c->id)
ret = silc_hash_table_del_by_context(cache->id_table, c->id, c);
else
- silc_free(c);
+ silc_idcache_destructor(NULL, c, NULL);
return ret;
}
SilcIDCache cache = (SilcIDCache)user_context;
SilcUInt32 curtime = time(NULL);
SilcIDCacheEntry c = (SilcIDCacheEntry)context;
+ bool ret = FALSE;
+
+ if (!context)
+ return;
if (c->expire && c->expire < curtime) {
/* Remove the entry from the hash tables */
if (c->name)
- silc_hash_table_del_by_context(cache->name_table, c->name, c);
+ ret = silc_hash_table_del_by_context(cache->name_table, c->name, c);
if (c->context)
- silc_hash_table_del(cache->context_table, c->context);
+ ret = silc_hash_table_del(cache->context_table, c->context);
if (c->id)
- silc_hash_table_del_by_context_ext(cache->id_table, c->id, c,
- NULL, NULL, NULL, NULL,
- silc_idcache_destructor_dummy, NULL);
-
- /* Call the destructor */
- if (cache->destructor)
- cache->destructor(cache, c);
-
- /* Free the entry, it has been deleted from the hash tables */
- silc_free(c);
+ ret =
+ silc_hash_table_del_by_context_ext(cache->id_table, c->id, c,
+ NULL, NULL, NULL, NULL,
+ silc_idcache_destructor_dummy,
+ NULL);
+ if (ret == TRUE) {
+ /* Call the destructor */
+ if (cache->destructor)
+ cache->destructor(cache, c);
+
+ /* Free the entry, it has been deleted from the hash tables */
+ silc_idcache_destructor(NULL, c, NULL);
+ }
}
}
silc_hash_table_del_by_context_ext(cache->id_table, c->id, c,
NULL, NULL, NULL, NULL,
silc_idcache_destructor_dummy, NULL);
-
- /* Call the destructor */
- if (cache->destructor)
- cache->destructor(cache, c);
+ if (ret == TRUE) {
+ /* Call the destructor */
+ if (cache->destructor)
+ cache->destructor(cache, c);
- /* Free the entry, it has been deleted from the hash tables */
- silc_free(c);
+ /* Free the entry, it has been deleted from the hash tables */
+ silc_idcache_destructor(NULL, c, NULL);
+ }
return ret;
}
void *user_context)
{
SilcIDCacheList list = (SilcIDCacheList)user_context;
+ if (!context)
+ return;
silc_idcache_list_add(list, (SilcIDCacheEntry)context);
}
return TRUE;
list = silc_idcache_list_alloc();
+ if (!list)
+ return FALSE;
silc_hash_table_foreach(cache->id_table, silc_idcache_get_all_foreach, list);
if (silc_idcache_list_count(list) == 0) {
SilcIDCacheList list;
list = silc_idcache_list_alloc();
+ if (!list)
+ return FALSE;
if (!ret)
return TRUE;
SilcIDCacheList list;
list = silc_idcache_list_alloc();
+ if (!list)
+ return FALSE;
if (!ret)
return TRUE;
SilcIDCacheList list;
list = silc_calloc(1, sizeof(*list));
+ if (!list)
+ return FALSE;
return list;
}
i = list->cache_dyn_count;
list->cache_dyn = silc_realloc(list->cache_dyn,
sizeof(*list->cache_dyn) * (i + 5));
+ if (!list->cache_dyn)
+ return;
/* NULL the reallocated area */
for (k = i; k < (i + 5); k++)