X-Git-Url: http://git.silcnet.org/gitweb/?p=silc.git;a=blobdiff_plain;f=apps%2Fsilcd%2Fserver_util.c;h=dead873a6d250037bff3b3c9a91a585e9a4acc0a;hp=3a549ae7ac7dc0cc982e69468a7f261aeaad31f1;hb=382d15d447b7a95390decfa783836ae4fe255b3d;hpb=b1bcb4f90a76779cdd1ace64bc20eb52d3053b70 diff --git a/apps/silcd/server_util.c b/apps/silcd/server_util.c index 3a549ae7..dead873a 100644 --- a/apps/silcd/server_util.c +++ b/apps/silcd/server_util.c @@ -43,7 +43,8 @@ silc_server_remove_clients_channels(SilcServer server, return; SILC_LOG_DEBUG(("Remove client %s from all channels", - client->nickname ? client->nickname : "")); + client->nickname ? client->nickname : + (unsigned char *)"")); if (silc_hash_table_find(clients, client, NULL, NULL)) silc_hash_table_del(clients, client); @@ -1514,7 +1515,7 @@ void silc_server_kill_client(SilcServer server, /* Remove the client from all channels. This generates new keys to the channels as well. */ silc_server_remove_from_channels(server, NULL, remote_client, FALSE, - NULL, TRUE); + NULL, TRUE, TRUE); /* Remove the client entry, If it is locally connected then we will also disconnect the client here */ @@ -1724,7 +1725,7 @@ bool silc_server_inviteban_match(SilcServer server, SilcHashTable list, unsigned char *tmp = NULL; SilcUInt32 len = 0, t; SilcHashTableList htl; - SilcBuffer entry; + SilcBuffer entry, idp = NULL; bool ret = FALSE; if (type < 1 || type > 3 || !check) @@ -1741,10 +1742,11 @@ bool silc_server_inviteban_match(SilcServer server, SilcHashTable list, return FALSE; } if (type == 3) { - tmp = silc_id_id2str(check, SILC_ID_CLIENT); - if (!tmp) + idp = silc_id_payload_encode(check, SILC_ID_CLIENT); + if (!idp) return FALSE; - len = silc_id_get_len(check, SILC_ID_CLIENT); + tmp = idp->data; + len = idp->len; } /* Compare the list */ @@ -1764,10 +1766,18 @@ bool silc_server_inviteban_match(SilcServer server, SilcHashTable list, } silc_hash_table_list_reset(&htl); - silc_free(tmp); + if (!idp) + silc_free(tmp); + silc_buffer_free(idp); return ret; } +static void silc_server_inviteban_dummy_dest(void *key, void *context, + void *user_context) +{ + /* Nothing */ +} + /* Process invite or ban information */ void silc_server_inviteban_process(SilcServer server, SilcHashTable list, @@ -1793,7 +1803,8 @@ void silc_server_inviteban_process(SilcServer server, SilcHashTable list, char *string = NULL; silc_hash_table_find(list, (void *)1, NULL, (void **)&string); - silc_hash_table_del(list, (void *)1); + silc_hash_table_del_ext(list, (void *)1, NULL, NULL, NULL, NULL, + silc_server_inviteban_dummy_dest, NULL); if (!string) string = silc_calloc(len + 2, sizeof(*string)); else @@ -1865,10 +1876,8 @@ void silc_server_inviteban_process(SilcServer server, SilcHashTable list, char *string = NULL, *start, *end, *n; if (silc_hash_table_find(list, (void *)1, NULL, (void **)&string)) { - silc_hash_table_del(list, (void *)1); - if (!strncmp(string, tmp, strlen(string) - 1)) { - silc_free(string); + silc_hash_table_del(list, (void *)1); string = NULL; } else { start = strstr(string, tmp); @@ -1877,7 +1886,7 @@ void silc_server_inviteban_process(SilcServer server, SilcHashTable list, n = silc_calloc(strlen(string) - len, sizeof(*n)); strncat(n, string, start - string); strncat(n, end + 1, ((string + strlen(string)) - end) - 1); - silc_free(string); + silc_hash_table_del(list, (void *)1); string = n; } } @@ -1895,7 +1904,6 @@ void silc_server_inviteban_process(SilcServer server, SilcHashTable list, while (silc_hash_table_get(&htl, (void **)&type, (void **)&tmp2)) { if (type == 2 && !memcmp(tmp2->data, tmp, len)) { silc_hash_table_del_by_context(list, (void *)2, tmp2); - silc_buffer_free(tmp2); break; } } @@ -1907,9 +1915,8 @@ void silc_server_inviteban_process(SilcServer server, SilcHashTable list, /* Delete from the invite list */ silc_hash_table_list(list, &htl); while (silc_hash_table_get(&htl, (void **)&type, (void **)&tmp2)) { - if (type == 2 && !memcmp(tmp2->data, tmp, len)) { - silc_hash_table_del_by_context(list, (void *)2, tmp2); - silc_buffer_free(tmp2); + if (type == 3 && !memcmp(tmp2->data, tmp, len)) { + silc_hash_table_del_by_context(list, (void *)3, tmp2); break; } } @@ -1920,3 +1927,23 @@ void silc_server_inviteban_process(SilcServer server, SilcHashTable list, } } } + +/* Destructor for invite or ban list entrys */ + +void silc_server_inviteban_destruct(void *key, void *context, + void *user_context) +{ + switch ((SilcUInt32)key) { + case 1: + /* Invite string */ + silc_free(context); + break; + case 2: + case 3: + /* Public key/Channel ID SilcBuffer */ + silc_buffer_free(context); + break; + default: + break; + } +}