return;
client_entry = silc_client_get_client_by_id(client, conn, &id.u.client_id);
- if (client_entry)
+ if (client_entry) {
+ silc_client_unref_client(client, conn, client_entry);
silc_client_del_client(client, conn, client_entry);
+ }
}
}
realname, channel_list, mode, idle, fingerprint,
umodes, client_entry->attrs);
+ silc_client_unref_client(client, conn, client_entry);
if (has_channels) {
silc_dlist_uninit(channel_list);
silc_free(umodes);
SilcClient client = conn->client;
SilcCommandPayload payload = state_context;
SilcArgumentPayload args = silc_command_get_args(payload);
- SilcClientEntry client_entry;
+ SilcClientEntry client_entry = NULL;
SilcID id;
char *nickname, *username;
char *realname = NULL;
realname);
out:
+ silc_client_unref_client(client, conn, client_entry);
silc_fsm_next(fsm, silc_client_command_reply_process);
return SILC_FSM_CONTINUE;
}
/* Notify application */
silc_client_command_callback(cmd, client_entry, name, info);
+ silc_client_unref_client(client, conn, client_entry);
break;
case SILC_ID_SERVER:
silc_client_command_callback(cmd, client_entry);
/* Remove the client from all channels and free it */
- if (client_entry)
+ if (client_entry) {
silc_client_del_client(client, conn, client_entry);
+ silc_client_unref_client(client, conn, client_entry);
+ }
out:
silc_fsm_next(fsm, silc_client_command_reply_process);
/* Join client to the channel */
if (!silc_client_on_channel(channel, client_entry)) {
chu = silc_calloc(1, sizeof(*chu));
- if (!chu)
+ if (!chu) {
+ silc_client_unref_client(client, conn, client_entry);
goto out;
+ }
chu->client = client_entry;
chu->channel = channel;
chu->mode = mode;
silc_hash_table_add(channel->user_list, client_entry, chu);
silc_hash_table_add(client_entry->channels, channel, chu);
}
+ silc_client_unref_client(client, conn, client_entry);
- silc_buffer_pull(client_id_list, idp_len);
- silc_buffer_pull(client_mode_list, 4);
+ if (!silc_buffer_pull(client_id_list, idp_len))
+ goto out;
+ if (!silc_buffer_pull(client_mode_list, 4))
+ goto out;
}
silc_buffer_start(client_id_list);
silc_buffer_start(client_mode_list);
/* Notify application */
silc_client_command_callback(cmd, mode, channel, client_entry);
+ silc_client_unref_client(client, conn, client_entry);
+
out:
silc_fsm_next(fsm, silc_client_command_reply_process);
return SILC_FSM_CONTINUE;
/* Notify application */
silc_client_command_callback(cmd, channel, client_entry);
+ silc_client_unref_client(client, conn, client_entry);
+
out:
silc_fsm_next(fsm, silc_client_command_reply_process);
return SILC_FSM_CONTINUE;
client_entry = silc_client_get_client_by_id(client, conn, &id.u.client_id);
if (client_entry && !silc_client_on_channel(channel, client_entry)) {
chu = silc_calloc(1, sizeof(*chu));
- if (!chu)
+ if (!chu) {
+ silc_client_unref_client(client, conn, client_entry);
goto out;
+ }
chu->client = client_entry;
chu->mode = mode;
chu->channel = channel;
silc_hash_table_add(channel->user_list, client_entry, chu);
silc_hash_table_add(client_entry->channels, channel, chu);
}
+ silc_client_unref_client(client, conn, client_entry);
if (!silc_buffer_pull(&client_id_list, idp_len))
goto out;
/* Notify application */
silc_client_command_callback(cmd, SILC_ID_CLIENT, client_entry,
client_entry->public_key);
+ silc_client_unref_client(client, conn, client_entry);
} else if (id.type == SILC_ID_SERVER) {
/* Received server's public key */
server_entry = silc_client_get_server_by_id(client, conn, &id.u.server_id);