SILC_LOG_DEBUG(("Start"));
if (entry) {
- /* Remove from cache. Destructor callback deletes stuff. */
if (!silc_idcache_del_by_context(id_list->clients, entry)) {
SILC_LOG_DEBUG(("Unknown client, did not delete"));
return FALSE;
/* ID Cache destructor */
void silc_idlist_client_destructor(SilcIDCache cache,
- SilcIDCacheEntry entry)
+ SilcIDCacheEntry entry,
+ void *context)
{
+ SilcServer server = context;
SilcClientEntry client;
client = (SilcClientEntry)entry->context;
if (client) {
+ /* Remove this client from the public key hash list */
+ if (client->data.public_key)
+ silc_hash_table_del_by_context(server->pk_hash,
+ client->data.public_key, client);
+
assert(!silc_hash_table_count(client->channels));
silc_free(client->nickname);
silc_free(client->servername);
silc_free(client->userinfo);
silc_free(client->id);
silc_free(client->attrs);
+ if (client->data.public_key)
+ silc_pkcs_public_key_free(client->data.public_key);
silc_hash_table_free(client->channels);
memset(client, 'A', sizeof(*client));