Check for NULL cache argument.
[silc.git] / lib / silcapputil / silcidcache.c
index 0c733276ddc4cd9d743d17920c3e0fe46627db05..1c23b290236100a20581bf3617f57aeaa652bd26 100644 (file)
@@ -4,7 +4,7 @@
 
   Author: Pekka Riikonen <priikone@silcnet.org>
 
-  Copyright (C) 2000 - 2006 Pekka Riikonen
+  Copyright (C) 2000 - 2007 Pekka Riikonen
 
   This program is free software; you can redistribute it and/or modify
   it under the terms of the GNU General Public License as published by
@@ -123,7 +123,7 @@ silc_idcache_add(SilcIDCache cache, char *name, void *id, void *context)
 {
   SilcIDCacheEntry c;
 
-  if (!id)
+  if (!cache || !id)
     return NULL;
 
   /* Allocate new cache entry */
@@ -138,15 +138,14 @@ silc_idcache_add(SilcIDCache cache, char *name, void *id, void *context)
   SILC_LOG_DEBUG(("Adding cache entry %p", c));
 
   /* Add the new entry to the hash tables */
-
-  if (id) {
-    if (silc_idcache_find_by_id_one(cache, id, NULL)) {
-      SILC_LOG_ERROR(("Attempted to add same ID twice to ID Cache"));
-      goto err;
-    }
-    if (!silc_hash_table_add(cache->id_table, id, c))
-      goto err;
+  if (silc_idcache_find_by_id_one(cache, id, NULL)) {
+    SILC_LOG_ERROR(("Attempted to add same ID twice to ID Cache, id %s",
+                  silc_id_render(id, cache->id_type)));
+    SILC_ASSERT(FALSE);
+    goto err;
   }
+  if (!silc_hash_table_add(cache->id_table, id, c))
+    goto err;
   if (name)
     if (!silc_hash_table_add(cache->name_table, name, c))
       goto err;
@@ -175,6 +174,9 @@ SilcBool silc_idcache_del(SilcIDCache cache, SilcIDCacheEntry entry,
 {
   SilcBool ret = FALSE;
 
+  if (!cache)
+    return FALSE;
+
   SILC_LOG_DEBUG(("Deleting cache entry %p", entry));
 
   if (entry->name)
@@ -200,6 +202,9 @@ SilcBool silc_idcache_del_by_id(SilcIDCache cache, void *id,
 {
   SilcIDCacheEntry c;
 
+  if (!cache)
+    return FALSE;
+
   if (!silc_hash_table_find(cache->id_table, id, NULL, (void **)&c))
     return FALSE;
 
@@ -213,6 +218,9 @@ SilcBool silc_idcache_del_by_context(SilcIDCache cache, void *context,
 {
   SilcIDCacheEntry c;
 
+  if (!cache)
+    return FALSE;
+
   if (!silc_hash_table_find(cache->context_table, context, NULL, (void **)&c))
     return FALSE;
 
@@ -225,6 +233,9 @@ SilcBool silc_idcache_update(SilcIDCache cache, SilcIDCacheEntry entry,
                             void *new_id, char *new_name,
                             SilcBool free_old_name)
 {
+  if (!cache)
+    return FALSE;
+
   if (new_id) {
     if (!silc_hash_table_del_by_context(cache->id_table, entry->id, entry))
       return FALSE;
@@ -241,8 +252,10 @@ SilcBool silc_idcache_update(SilcIDCache cache, SilcIDCacheEntry entry,
   }
 
   if (new_name) {
-    if (!silc_hash_table_del_by_context(cache->name_table, entry->name, entry))
-      return FALSE;
+    if (entry->name)
+      if (!silc_hash_table_del_by_context(cache->name_table, entry->name,
+                                         entry))
+       return FALSE;
 
     if (free_old_name)
       silc_free(entry->name);
@@ -263,6 +276,9 @@ SilcBool silc_idcache_update_by_context(SilcIDCache cache, void *context,
 {
   SilcIDCacheEntry c;
 
+  if (!cache)
+    return FALSE;
+
   if (!silc_hash_table_find(cache->context_table, context, NULL, (void **)&c))
     return FALSE;
 
@@ -273,12 +289,13 @@ SilcBool silc_idcache_update_by_context(SilcIDCache cache, void *context,
 
 SilcBool silc_idcache_get_all(SilcIDCache cache, SilcList *ret_list)
 {
-  if (!ret_list)
+  if (!cache || !ret_list)
     return FALSE;
 
   if (!silc_hash_table_count(cache->id_table))
     return FALSE;
 
+  silc_list_init(*ret_list, struct SilcIDCacheEntryStruct, next);
   silc_hash_table_foreach(cache->id_table, silc_idcache_get_all_foreach,
                          ret_list);
 
@@ -293,12 +310,13 @@ SilcBool silc_idcache_get_all(SilcIDCache cache, SilcList *ret_list)
 SilcBool silc_idcache_find_by_id(SilcIDCache cache, void *id,
                                 SilcList *ret_list)
 {
-  if (!ret_list)
+  if (!cache || !ret_list)
     return FALSE;
 
   if (!silc_hash_table_count(cache->id_table))
     return FALSE;
 
+  silc_list_init(*ret_list, struct SilcIDCacheEntryStruct, next);
   silc_hash_table_find_foreach(cache->id_table, id,
                               silc_idcache_get_all_foreach, ret_list);
 
@@ -313,6 +331,8 @@ SilcBool silc_idcache_find_by_id(SilcIDCache cache, void *id,
 SilcBool silc_idcache_find_by_id_one(SilcIDCache cache, void *id,
                                     SilcIDCacheEntry *ret)
 {
+  if (!cache)
+    return FALSE;
   return silc_hash_table_find_ext(cache->id_table, id, NULL, (void *)ret,
                                  NULL, NULL,
                                  silc_hash_id_compare_full,
@@ -324,6 +344,8 @@ SilcBool silc_idcache_find_by_id_one(SilcIDCache cache, void *id,
 SilcBool silc_idcache_find_by_context(SilcIDCache cache, void *context,
                                      SilcIDCacheEntry *ret)
 {
+  if (!cache)
+    return FALSE;
   return silc_hash_table_find(cache->context_table, context, NULL,
                              (void *)ret);
 }
@@ -333,12 +355,13 @@ SilcBool silc_idcache_find_by_context(SilcIDCache cache, void *context,
 SilcBool silc_idcache_find_by_name(SilcIDCache cache, char *name,
                                   SilcList *ret_list)
 {
-  if (!ret_list)
+  if (!cache || !ret_list)
     return FALSE;
 
   if (!silc_hash_table_count(cache->name_table))
     return FALSE;
 
+  silc_list_init(*ret_list, struct SilcIDCacheEntryStruct, next);
   silc_hash_table_find_foreach(cache->name_table, name,
                               silc_idcache_get_all_foreach, ret_list);
 
@@ -353,5 +376,7 @@ SilcBool silc_idcache_find_by_name(SilcIDCache cache, char *name,
 SilcBool silc_idcache_find_by_name_one(SilcIDCache cache, char *name,
                                       SilcIDCacheEntry *ret)
 {
+  if (!cache)
+    return FALSE;
   return silc_hash_table_find(cache->name_table, name, NULL, (void *)ret);
 }