*/
struct SilcIDCacheListStruct {
- SilcIDCacheEntry cache[64];
+ SilcIDCacheEntry cache[128];
SilcIDCacheEntry *cache_dyn;
SilcUInt32 cache_dyn_count;
SilcUInt32 cache_count;
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;
}