projects
/
silc.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
Make sure client entry is not expired more than once
[silc.git]
/
apps
/
silcd
/
server_util.c
diff --git
a/apps/silcd/server_util.c
b/apps/silcd/server_util.c
index 3fb71553fd77ad666f66ba925fe94f37fce8f371..274bd0f58b483bbefbbe4bd2baf06740056f30f3 100644
(file)
--- a/
apps/silcd/server_util.c
+++ b/
apps/silcd/server_util.c
@@
-4,7
+4,7
@@
Author: Pekka Riikonen <priikone@silcnet.org>
Author: Pekka Riikonen <priikone@silcnet.org>
- Copyright (C) 1997 - 200
5, 2007
Pekka Riikonen
+ Copyright (C) 1997 - 200
8
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
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
@@
-228,6
+228,7
@@
SilcBool silc_server_remove_clients_by_server(SilcServer server,
client->mode = 0;
client->router = NULL;
client->connection = NULL;
client->mode = 0;
client->router = NULL;
client->connection = NULL;
+ silc_dlist_del(server->expired_clients, client);
silc_dlist_add(server->expired_clients, client);
} else {
silc_idlist_del_data(client);
silc_dlist_add(server->expired_clients, client);
} else {
silc_idlist_del_data(client);
@@
-289,6
+290,7
@@
SilcBool silc_server_remove_clients_by_server(SilcServer server,
client->mode = 0;
client->router = NULL;
client->connection = NULL;
client->mode = 0;
client->router = NULL;
client->connection = NULL;
+ silc_dlist_del(server->expired_clients, client);
silc_dlist_add(server->expired_clients, client);
} else {
silc_idlist_del_data(client);
silc_dlist_add(server->expired_clients, client);
} else {
silc_idlist_del_data(client);
@@
-997,7
+999,7
@@
SilcUInt32 silc_server_num_sockets_by_ip(SilcServer server, const char *ip,
silc_dlist_start(server->conns);
while ((conn = silc_dlist_get(server->conns))) {
silc_dlist_start(server->conns);
while ((conn = silc_dlist_get(server->conns))) {
- if (!conn->sock)
+ if (!conn->sock
|| !silc_packet_stream_is_valid(conn->sock)
)
continue;
silc_socket_stream_get_info(silc_packet_stream_get_stream(conn->sock),
NULL, NULL, &ipaddr, NULL);
continue;
silc_socket_stream_get_info(silc_packet_stream_get_stream(conn->sock),
NULL, NULL, &ipaddr, NULL);
@@
-1023,7
+1025,7
@@
silc_server_find_socket_by_host(SilcServer server,
silc_dlist_start(server->conns);
while ((conn = silc_dlist_get(server->conns))) {
silc_dlist_start(server->conns);
while ((conn = silc_dlist_get(server->conns))) {
- if (!conn->sock)
+ if (!conn->sock
|| !silc_packet_stream_is_valid(conn->sock)
)
continue;
idata = silc_packet_get_context(conn->sock);
silc_socket_stream_get_info(silc_packet_stream_get_stream(conn->sock),
continue;
idata = silc_packet_get_context(conn->sock);
silc_socket_stream_get_info(silc_packet_stream_get_stream(conn->sock),
@@
-1195,6
+1197,7
@@
SilcBool silc_server_connection_allowed(SilcServer server,
silc_server_disconnect_remote(server, sock,
SILC_STATUS_ERR_BAD_VERSION,
"You support too old protocol version");
silc_server_disconnect_remote(server, sock,
SILC_STATUS_ERR_BAD_VERSION,
"You support too old protocol version");
+ silc_server_free_sock_user_data(server, sock, NULL);
return FALSE;
}
return FALSE;
}
@@
-1206,6
+1209,7
@@
SilcBool silc_server_connection_allowed(SilcServer server,
silc_server_disconnect_remote(server, sock,
SILC_STATUS_ERR_BAD_VERSION,
"You support too old software version");
silc_server_disconnect_remote(server, sock,
SILC_STATUS_ERR_BAD_VERSION,
"You support too old software version");
+ silc_server_free_sock_user_data(server, sock, NULL);
return FALSE;
}
return FALSE;
}
@@
-1217,6
+1221,7
@@
SilcBool silc_server_connection_allowed(SilcServer server,
silc_server_disconnect_remote(server, sock,
SILC_STATUS_ERR_BAD_VERSION,
"Your software is not supported");
silc_server_disconnect_remote(server, sock,
SILC_STATUS_ERR_BAD_VERSION,
"Your software is not supported");
+ silc_server_free_sock_user_data(server, sock, NULL);
return FALSE;
}
}
return FALSE;
}
}
@@
-1236,6
+1241,7
@@
SilcBool silc_server_connection_allowed(SilcServer server,
silc_server_disconnect_remote(server, sock,
SILC_STATUS_ERR_RESOURCE_LIMIT,
"Server is full, try again later");
silc_server_disconnect_remote(server, sock,
SILC_STATUS_ERR_RESOURCE_LIMIT,
"Server is full, try again later");
+ silc_server_free_sock_user_data(server, sock, NULL);
return FALSE;
}
return FALSE;
}
@@
-1247,6
+1253,7
@@
SilcBool silc_server_connection_allowed(SilcServer server,
silc_server_disconnect_remote(server, sock,
SILC_STATUS_ERR_RESOURCE_LIMIT,
"Too many connections from your host");
silc_server_disconnect_remote(server, sock,
SILC_STATUS_ERR_RESOURCE_LIMIT,
"Too many connections from your host");
+ silc_server_free_sock_user_data(server, sock, NULL);
return FALSE;
}
return FALSE;
}
@@
-1538,7
+1545,7
@@
void silc_server_kill_client(SilcServer server,
if (remote_client->connection) {
/* Remove locally conneted client */
SilcPacketStream sock = remote_client->connection;
if (remote_client->connection) {
/* Remove locally conneted client */
SilcPacketStream sock = remote_client->connection;
- silc_server_free_
client_data(server, sock, remote_client, FALSE
, NULL);
+ silc_server_free_
sock_user_data(server, sock
, NULL);
silc_server_close_connection(server, sock);
} else {
/* Update statistics */
silc_server_close_connection(server, sock);
} else {
/* Update statistics */
@@
-1753,10
+1760,11
@@
SilcBool silc_server_inviteban_match(SilcServer server, SilcHashTable list,
SilcUInt8 type, void *check)
{
unsigned char *tmp = NULL;
SilcUInt8 type, void *check)
{
unsigned char *tmp = NULL;
- SilcUInt32 len = 0
, t
;
+ SilcUInt32 len = 0;
SilcHashTableList htl;
SilcBuffer entry, idp = NULL, pkp = NULL;
SilcBool ret = FALSE;
SilcHashTableList htl;
SilcBuffer entry, idp = NULL, pkp = NULL;
SilcBool ret = FALSE;
+ void *t;
SILC_LOG_DEBUG(("Matching invite/ban"));
SILC_LOG_DEBUG(("Matching invite/ban"));
@@
-1786,13
+1794,14
@@
SilcBool silc_server_inviteban_match(SilcServer server, SilcHashTable list,
/* Compare the list */
silc_hash_table_list(list, &htl);
while (silc_hash_table_get(&htl, (void *)&t, (void *)&entry)) {
/* Compare the list */
silc_hash_table_list(list, &htl);
while (silc_hash_table_get(&htl, (void *)&t, (void *)&entry)) {
- if (type ==
t
) {
+ if (type ==
SILC_PTR_TO_32(t)
) {
if (type == 1) {
if (silc_string_match(entry->data, tmp)) {
ret = TRUE;
break;
}
if (type == 1) {
if (silc_string_match(entry->data, tmp)) {
ret = TRUE;
break;
}
- } else if (!memcmp(entry->data, tmp, len)) {
+ } else if (silc_buffer_len(entry) == len &&
+ !memcmp(entry->data, tmp, len)) {
ret = TRUE;
break;
}
ret = TRUE;
break;
}
@@
-1816,6
+1825,7
@@
SilcBool silc_server_inviteban_process(SilcServer server,
{
unsigned char *tmp;
SilcUInt32 type, len;
{
unsigned char *tmp;
SilcUInt32 type, len;
+ void *ptype;
SilcBuffer tmp2;
SilcHashTableList htl;
SilcBuffer tmp2;
SilcHashTableList htl;
@@
-1842,8
+1852,9
@@
SilcBool silc_server_inviteban_process(SilcServer server,
/* Check if the string is added already */
silc_hash_table_list(list, &htl);
/* Check if the string is added already */
silc_hash_table_list(list, &htl);
- while (silc_hash_table_get(&htl, (void *)&type, (void *)&tmp2)) {
- if (type == 1 && silc_string_match(tmp2->data, tmp)) {
+ while (silc_hash_table_get(&htl, (void *)&ptype, (void *)&tmp2)) {
+ if (SILC_PTR_TO_32(ptype) == 1 &&
+ silc_string_match(tmp2->data, tmp)) {
tmp = NULL;
break;
}
tmp = NULL;
break;
}
@@
-1873,8
+1884,8
@@
SilcBool silc_server_inviteban_process(SilcServer server,
/* Check if the public key is in the list already */
silc_hash_table_list(list, &htl);
/* Check if the public key is in the list already */
silc_hash_table_list(list, &htl);
- while (silc_hash_table_get(&htl, (void *)&type, (void *)&tmp2)) {
- if (
type
== 2 && !memcmp(tmp2->data, tmp, len)) {
+ while (silc_hash_table_get(&htl, (void *)&
p
type, (void *)&tmp2)) {
+ if (
SILC_PTR_TO_32(ptype)
== 2 && !memcmp(tmp2->data, tmp, len)) {
tmp = NULL;
break;
}
tmp = NULL;
break;
}
@@
-1893,8
+1904,8
@@
SilcBool silc_server_inviteban_process(SilcServer server,
/* Check if the ID is in the list already */
silc_hash_table_list(list, &htl);
/* Check if the ID is in the list already */
silc_hash_table_list(list, &htl);
- while (silc_hash_table_get(&htl, (void *)&type, (void *)&tmp2)) {
- if (
type
== 3 && !memcmp(tmp2->data, tmp, len)) {
+ while (silc_hash_table_get(&htl, (void *)&
p
type, (void *)&tmp2)) {
+ if (
SILC_PTR_TO_32(ptype)
== 3 && !memcmp(tmp2->data, tmp, len)) {
tmp = NULL;
break;
}
tmp = NULL;
break;
}
@@
-1932,8
+1943,9
@@
SilcBool silc_server_inviteban_process(SilcServer server,
/* Delete from the list */
silc_hash_table_list(list, &htl);
/* Delete from the list */
silc_hash_table_list(list, &htl);
- while (silc_hash_table_get(&htl, (void *)&type, (void *)&tmp2)) {
- if (type == 1 && silc_string_match(tmp2->data, tmp)) {
+ while (silc_hash_table_get(&htl, (void *)&ptype, (void *)&tmp2)) {
+ if (SILC_PTR_TO_32(ptype) == 1 &&
+ silc_string_match(tmp2->data, tmp)) {
silc_hash_table_del_by_context(list, (void *)1, tmp2);
break;
}
silc_hash_table_del_by_context(list, (void *)1, tmp2);
break;
}
@@
-1953,8
+1965,8
@@
SilcBool silc_server_inviteban_process(SilcServer server,
/* Delete from the invite list */
silc_hash_table_list(list, &htl);
/* 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)) {
+ while (silc_hash_table_get(&htl, (void *)&
p
type, (void *)&tmp2)) {
+ if (
SILC_PTR_TO_32(ptype)
== 2 && !memcmp(tmp2->data, tmp, len)) {
silc_hash_table_del_by_context(list, (void *)2, tmp2);
break;
}
silc_hash_table_del_by_context(list, (void *)2, tmp2);
break;
}
@@
-1966,8
+1978,8
@@
SilcBool silc_server_inviteban_process(SilcServer server,
/* Delete from the invite list */
silc_hash_table_list(list, &htl);
/* Delete from the invite list */
silc_hash_table_list(list, &htl);
- while (silc_hash_table_get(&htl, (void *)&type, (void *)&tmp2)) {
- if (
type
== 3 && !memcmp(tmp2->data, tmp, len)) {
+ while (silc_hash_table_get(&htl, (void *)&
p
type, (void *)&tmp2)) {
+ if (
SILC_PTR_TO_32(ptype)
== 3 && !memcmp(tmp2->data, tmp, len)) {
silc_hash_table_del_by_context(list, (void *)3, tmp2);
break;
}
silc_hash_table_del_by_context(list, (void *)3, tmp2);
break;
}
@@
-2097,6
+2109,8
@@
SilcBuffer silc_server_get_channel_pk_list(SilcServer server,
silc_hash_table_list(channel->channel_pubkeys, &htl);
while (silc_hash_table_get(&htl, NULL, (void *)&pk)) {
pkp = silc_public_key_payload_encode(pk);
silc_hash_table_list(channel->channel_pubkeys, &htl);
while (silc_hash_table_get(&htl, NULL, (void *)&pk)) {
pkp = silc_public_key_payload_encode(pk);
+ if (!pkp)
+ continue;
list = silc_argument_payload_encode_one(list, pkp->data,
silc_buffer_len(pkp),
announce ? 0x03 :
list = silc_argument_payload_encode_one(list, pkp->data,
silc_buffer_len(pkp),
announce ? 0x03 :