Static analyzer bug fixes
[silc.git] / apps / silcd / idlist.c
index a29ba9fb1f9a1817e182917437ef706ab71f511b..5eb063e58d6ea9af5b41c04e3eac6ddf3dd3861e 100644 (file)
@@ -55,9 +55,10 @@ void silc_idlist_del_data(void *entry)
 
   if (idata->hash)
     silc_hash_free(idata->hash);
-  if (idata->public_key)
-    silc_pkcs_public_key_free(idata->public_key);
+  if (idata->rekey)
+    silc_ske_free_rekey_material(idata->rekey);
 
+  idata->rekey = NULL;
   idata->hash = NULL;
   idata->public_key = NULL;
 }
@@ -93,6 +94,10 @@ silc_idlist_add_server(SilcIDList id_list,
   }
 
   server = silc_calloc(1, sizeof(*server));
+  if (!server) {
+    silc_free(server_namec);
+    return NULL;
+  }
   server->server_name = server_name;
   server->server_type = server_type;
   server->id = id;
@@ -328,7 +333,7 @@ silc_idlist_add_client(SilcIDList id_list, char *nickname, char *username,
     int ret;
 
     ret = silc_parse_userfqdn(username, u, sizeof(u), h, sizeof(h));
-    if (!u)
+    if (!ret)
       return NULL;
     if (!silc_identifier_verify(u, strlen(u), SILC_STRING_UTF8, 128))
       return NULL;
@@ -338,6 +343,8 @@ silc_idlist_add_client(SilcIDList id_list, char *nickname, char *username,
   }
 
   client = silc_calloc(1, sizeof(*client));
+  if (!client)
+    return NULL;
   client->nickname = nickname;
   client->username = username ? strdup(username) : NULL;
   client->userinfo = userinfo;
@@ -395,6 +402,7 @@ void silc_idlist_client_destructor(SilcIDCache cache,
                              client);
 
     assert(!silc_hash_table_count(client->channels));
+    silc_free(entry->name);
     silc_free(client->nickname);
     silc_free(client->servername);
     silc_free(client->username);
@@ -558,18 +566,17 @@ silc_idlist_replace_client_id(SilcServer server,
 
   client = (SilcClientEntry)id_cache->context;
 
-  /* Remove the old entry and add a new one */
-
-  if (!silc_idcache_del_by_context(id_list->clients, client, server))
-    return NULL;
-
   /* Check if anyone is watching old nickname */
   if (server->server_type == SILC_ROUTER)
     silc_server_check_watcher_list(server, client, nickname,
                                   SILC_NOTIFY_TYPE_NICK_CHANGE);
 
+  /* Replace */
+  if (!silc_idcache_update(id_list->clients, id_cache, new_id, nicknamec,
+                          TRUE))
+    return NULL;
+
   silc_free(client->nickname);
-  *client->id = *new_id;
   client->nickname = nickname ? strdup(nickname) : NULL;
 
   /* Check if anyone is watching new nickname */
@@ -577,10 +584,6 @@ silc_idlist_replace_client_id(SilcServer server,
     silc_server_check_watcher_list(server, client, nickname,
                                   SILC_NOTIFY_TYPE_NICK_CHANGE);
 
-  if (!silc_idcache_add(id_list->clients, nicknamec, client->id,
-                       client))
-    return NULL;
-
   SILC_LOG_DEBUG(("Replaced"));
 
   return client;
@@ -616,6 +619,10 @@ silc_idlist_add_channel(SilcIDList id_list, char *channel_name, int mode,
   }
 
   channel = silc_calloc(1, sizeof(*channel));
+  if (!channel) {
+    silc_free(channel_namec);
+    return NULL;
+  }
   channel->channel_name = channel_name;
   channel->mode = mode;
   channel->id = id;
@@ -841,6 +848,8 @@ silc_idlist_get_channels(SilcIDList id_list, SilcChannelID *channel_id,
       return NULL;
 
     channels = silc_calloc(silc_list_count(list), sizeof(*channels));
+    if (!channels)
+      return NULL;
 
     i = 0;
     silc_list_start(list);
@@ -852,6 +861,8 @@ silc_idlist_get_channels(SilcIDList id_list, SilcChannelID *channel_id,
 
     i = 1;
     channels = silc_calloc(1, sizeof(*channels));
+    if (!channels)
+      return NULL;
     channels[0] = (SilcChannelEntry)id_cache->context;
   }