Code auditing weekend results and fixes committing.
[silc.git] / apps / silcd / command_reply.c
index 073bf822477dc3332e990347004644c83f8ef499..b6858d77ff63f33ba78018a00bbe57b7730f8a08 100644 (file)
@@ -4,7 +4,7 @@
 
   Author: Pekka Riikonen <priikone@poseidon.pspt.fi>
 
-  Copyright (C) 1997 - 2000 Pekka Riikonen
+  Copyright (C) 1997 - 2001 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
@@ -142,6 +142,8 @@ silc_server_command_reply_whois_save(SilcServerCommandReplyContext cmd)
     return FALSE;
 
   client_id = silc_id_payload_parse_id(id_data, id_len);
+  if (!client_id)
+    return FALSE;
 
   /* Check if we have this client cached already. */
 
@@ -227,25 +229,6 @@ SILC_SERVER_CMD_REPLY_FUNC(whois)
   if (!silc_server_command_reply_whois_save(cmd))
     goto out;
 
-  /* XXX */
-
-  /* Process one identify reply */
-  if (status == SILC_STATUS_OK) {
-
-  }
-
-  if (status == SILC_STATUS_LIST_START) {
-
-  }
-
-  if (status == SILC_STATUS_LIST_ITEM) {
-
-  }
-
-  if (status == SILC_STATUS_LIST_END) {
-
-  }
-
   /* Execute any pending commands */
   SILC_SERVER_COMMAND_EXEC_PENDING(cmd, SILC_COMMAND_WHOIS);
 
@@ -275,6 +258,8 @@ silc_server_command_reply_identify_save(SilcServerCommandReplyContext cmd)
     return FALSE;
 
   client_id = silc_id_payload_parse_id(id_data, id_len);
+  if (!client_id)
+    return FALSE;
 
   /* Check if we have this client cached already. */
 
@@ -325,10 +310,11 @@ silc_server_command_reply_identify_save(SilcServerCommandReplyContext cmd)
       }
     }
 
-    if (nickname && client->nickname) {
+    if (nickname && client->nickname)
       silc_free(client->nickname);
+
+    if (nickname)
       client->nickname = nick;
-    }
 
     if (username && client->username) {
       silc_free(client->username);
@@ -362,24 +348,6 @@ SILC_SERVER_CMD_REPLY_FUNC(identify)
   if (!silc_server_command_reply_identify_save(cmd))
     goto out;
 
-  /* XXX */
-
-  if (status == SILC_STATUS_OK) {
-
-  }
-
-  if (status == SILC_STATUS_LIST_START) {
-
-  }
-
-  if (status == SILC_STATUS_LIST_ITEM) {
-
-  }
-
-  if (status == SILC_STATUS_LIST_END) {
-
-  }
-
   /* Execute any pending commands */
   SILC_SERVER_COMMAND_EXEC_PENDING(cmd, SILC_COMMAND_IDENTIFY);
 
@@ -398,7 +366,7 @@ SILC_SERVER_CMD_REPLY_FUNC(join)
   SilcCommandStatus status;
   SilcChannelID *id;
   SilcChannelEntry entry;
-  unsigned int len;
+  unsigned int id_len, len;
   unsigned char *id_string;
   char *channel_name, *tmp;
   unsigned int mode, created;
@@ -412,7 +380,7 @@ SILC_SERVER_CMD_REPLY_FUNC(join)
     goto out;
 
   /* Get channel ID */
-  id_string = silc_argument_get_arg_type(cmd->args, 3, &len);
+  id_string = silc_argument_get_arg_type(cmd->args, 3, &id_len);
   if (!id_string)
     goto out;
 
@@ -427,6 +395,8 @@ SILC_SERVER_CMD_REPLY_FUNC(join)
   if (!tmp)
     goto out;
   SILC_GET32_MSB(created, tmp);
+  if (created != 0 && created != 1)
+    goto out;
 
   /* Get channel key */
   tmp = silc_argument_get_arg_type(cmd->args, 6, &len);
@@ -436,7 +406,9 @@ SILC_SERVER_CMD_REPLY_FUNC(join)
   silc_buffer_pull_tail(keyp, SILC_BUFFER_END(keyp));
   silc_buffer_put(keyp, tmp, len);
 
-  id = silc_id_payload_parse_id(id_string, len);
+  id = silc_id_payload_parse_id(id_string, id_len);
+  if (!id)
+    goto out;
 
   /* See whether we already have the channel. */
   entry = silc_idlist_find_channel_by_id(server->local_list, id, NULL);
@@ -504,6 +476,8 @@ SILC_SERVER_CMD_REPLY_FUNC(users)
   if (!tmp)
     goto out;
   channel_id = silc_id_payload_parse_id(tmp, tmp_len);
+  if (!channel_id)
+    goto out;
 
   /* Get the list count */
   tmp = silc_argument_get_arg_type(cmd->args, 3, &tmp_len);
@@ -552,6 +526,8 @@ SILC_SERVER_CMD_REPLY_FUNC(users)
     SILC_GET16_MSB(idp_len, client_id_list->data + 2);
     idp_len += 4;
     client_id = silc_id_payload_parse_id(client_id_list->data, idp_len);
+    if (!client_id)
+      continue;
     silc_buffer_pull(client_id_list, idp_len);
     
     /* Mode */
@@ -573,12 +549,27 @@ SILC_SERVER_CMD_REPLY_FUNC(users)
       /* We don't have that client anywhere, add it. The client is added
         to global list since server didn't have it in the lists so it must be 
         global. */
-      silc_idlist_add_client(server->global_list, NULL, NULL, NULL,
-                            client_id, NULL, NULL);
+      client = silc_idlist_add_client(server->global_list, NULL, NULL, 
+                                     NULL, client_id, cmd->sock->user_data, 
+                                     NULL);
+      if (!client) {
+       silc_free(client_id);
+       continue;
+      }
     } else {
       /* We have the client already. */
       silc_free(client_id);
     }
+
+    if (!silc_server_client_on_channel(client, channel)) {
+      /* Client was not on the channel, add it. */
+      SilcChannelClientEntry chl = silc_calloc(1, sizeof(*chl));
+      chl->client = client;
+      chl->mode = mode;
+      chl->channel = channel;
+      silc_list_add(channel->user_list, chl);
+      silc_list_add(client->channels, chl);
+    }
   }
 
   silc_buffer_free(client_id_list);