projects
/
silc.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
Reorder #if 0/#endif block to avoid splitting a basic block across the #if 0.
[silc.git]
/
apps
/
silcd
/
server.c
diff --git
a/apps/silcd/server.c
b/apps/silcd/server.c
index 81f2a922382cc3eb86bee441b383722d61da384d..45231d05708ba94b80d3a4cdf0ba614e047d846b 100644
(file)
--- a/
apps/silcd/server.c
+++ b/
apps/silcd/server.c
@@
-1263,13
+1263,10
@@
SILC_TASK_CALLBACK(silc_server_purge_expired_clients)
silc_dlist_start(server->expired_clients);
while ((client = silc_dlist_get(server->expired_clients))) {
silc_dlist_start(server->expired_clients);
while ((client = silc_dlist_get(server->expired_clients))) {
- if (client->data.status & SILC_IDLIST_STATUS_REGISTERED)
- continue;
-
/* For unregistered clients the created timestamp is actually
unregistered timestamp. Make sure client remains in history
at least 500 seconds. */
/* For unregistered clients the created timestamp is actually
unregistered timestamp. Make sure client remains in history
at least 500 seconds. */
- if (curtime - client->data.created < 500)
+ if (c
lient->data.created && c
urtime - client->data.created < 500)
continue;
id_list = (client->data.status & SILC_IDLIST_STATUS_LOCAL ?
continue;
id_list = (client->data.status & SILC_IDLIST_STATUS_LOCAL ?
@@
-1292,6
+1289,8
@@
SILC_TASK_CALLBACK(silc_server_purge_expired_clients)
void silc_server_connection_free(SilcServerConnection sconn)
{
void silc_server_connection_free(SilcServerConnection sconn)
{
+ if (!sconn)
+ return;
SILC_LOG_DEBUG(("Free connection %p", sconn));
silc_dlist_del(sconn->server->conns, sconn);
silc_server_config_unref(&sconn->conn);
SILC_LOG_DEBUG(("Free connection %p", sconn));
silc_dlist_del(sconn->server->conns, sconn);
silc_server_config_unref(&sconn->conn);
@@
-1356,12
+1355,11
@@
silc_server_ke_auth_compl(SilcConnAuth connauth, SilcBool success,
/* Authentication failed */
/* XXX retry connecting */
/* Authentication failed */
/* XXX retry connecting */
- silc_server_disconnect_remote(server, sconn->sock,
- SILC_STATUS_ERR_AUTH_FAILED, NULL);
if (sconn->callback)
(*sconn->callback)(server, NULL, sconn->callback_context);
silc_server_free_sock_user_data(server, sconn->sock, NULL);
if (sconn->callback)
(*sconn->callback)(server, NULL, sconn->callback_context);
silc_server_free_sock_user_data(server, sconn->sock, NULL);
- silc_server_connection_free(sconn);
+ silc_server_disconnect_remote(server, sconn->sock,
+ SILC_STATUS_ERR_AUTH_FAILED, NULL);
return;
}
return;
}
@@
-1383,13
+1381,11
@@
silc_server_ke_auth_compl(SilcConnAuth connauth, SilcBool success,
strdup(sconn->remote_host),
SILC_SERVER, NULL, NULL, sconn->sock);
if (!id_entry) {
strdup(sconn->remote_host),
SILC_SERVER, NULL, NULL, sconn->sock);
if (!id_entry) {
- silc_server_disconnect_remote(server, sconn->sock,
- SILC_STATUS_ERR_RESOURCE_LIMIT, NULL);
if (sconn->callback)
(*sconn->callback)(server, NULL, sconn->callback_context);
silc_server_free_sock_user_data(server, sconn->sock, NULL);
if (sconn->callback)
(*sconn->callback)(server, NULL, sconn->callback_context);
silc_server_free_sock_user_data(server, sconn->sock, NULL);
- silc_server_
connection_free(sconn);
-
silc_free(entry
);
+ silc_server_
disconnect_remote(server, sconn->sock,
+
SILC_STATUS_ERR_RESOURCE_LIMIT, NULL
);
return;
}
return;
}
@@
-1414,13
+1410,11
@@
silc_server_ke_auth_compl(SilcConnAuth connauth, SilcBool success,
SILC_STR_DATA(server->server_name,
strlen(server->server_name)),
SILC_STR_END)) {
SILC_STR_DATA(server->server_name,
strlen(server->server_name)),
SILC_STR_END)) {
- silc_server_disconnect_remote(server, sconn->sock,
- SILC_STATUS_ERR_RESOURCE_LIMIT, NULL);
if (sconn->callback)
(*sconn->callback)(server, NULL, sconn->callback_context);
silc_server_free_sock_user_data(server, sconn->sock, NULL);
if (sconn->callback)
(*sconn->callback)(server, NULL, sconn->callback_context);
silc_server_free_sock_user_data(server, sconn->sock, NULL);
- silc_server_
connection_free(sconn);
-
silc_free(entry
);
+ silc_server_
disconnect_remote(server, sconn->sock,
+
SILC_STATUS_ERR_RESOURCE_LIMIT, NULL
);
return;
}
return;
}
@@
-1454,13
+1448,11
@@
silc_server_ke_auth_compl(SilcConnAuth connauth, SilcBool success,
SILC_ID_SERVER),
NULL, sconn->sock);
if (!id_entry) {
SILC_ID_SERVER),
NULL, sconn->sock);
if (!id_entry) {
- silc_server_disconnect_remote(server, sconn->sock,
- SILC_STATUS_ERR_RESOURCE_LIMIT, NULL);
if (sconn->callback)
(*sconn->callback)(server, NULL, sconn->callback_context);
silc_server_free_sock_user_data(server, sconn->sock, NULL);
if (sconn->callback)
(*sconn->callback)(server, NULL, sconn->callback_context);
silc_server_free_sock_user_data(server, sconn->sock, NULL);
- silc_server_
connection_free(sconn);
-
silc_free(entry
);
+ silc_server_
disconnect_remote(server, sconn->sock,
+
SILC_STATUS_ERR_RESOURCE_LIMIT, NULL
);
return;
}
return;
}
@@
-1514,20
+1506,20
@@
silc_server_ke_auth_compl(SilcConnAuth connauth, SilcBool success,
silc_server_backup_add(server, server->id_entry, ip,
sconn->remote_port, TRUE);
}
silc_server_backup_add(server, server->id_entry, ip,
sconn->remote_port, TRUE);
}
+ }
#if 0
#if 0
-
}
else {
+
else {
/* We already have primary router. Disconnect this connection */
SILC_LOG_DEBUG(("We already have primary router, disconnect"));
silc_idlist_del_server(server->global_list, id_entry);
/* We already have primary router. Disconnect this connection */
SILC_LOG_DEBUG(("We already have primary router, disconnect"));
silc_idlist_del_server(server->global_list, id_entry);
- silc_server_disconnect_remote(server, sconn->sock,
- SILC_STATUS_ERR_RESOURCE_LIMIT, NULL);
if (sconn->callback)
(*sconn->callback)(server, NULL, sconn->callback_context);
if (sconn->callback)
(*sconn->callback)(server, NULL, sconn->callback_context);
- silc_server_connection_free(sconn);
- silc_free(entry);
+ silc_server_free_sock_user_data(server, sconn->sock, NULL);
+ silc_server_disconnect_remote(server, sconn->sock,
+ SILC_STATUS_ERR_RESOURCE_LIMIT, NULL);
return;
return;
-#endif /* 0 */
}
}
+#endif /* 0 */
} else {
/* Add this server to be our backup router */
id_entry->server_type = SILC_BACKUP_ROUTER;
} else {
/* Add this server to be our backup router */
id_entry->server_type = SILC_BACKUP_ROUTER;
@@
-1538,13
+1530,11
@@
silc_server_ke_auth_compl(SilcConnAuth connauth, SilcBool success,
break;
default:
break;
default:
- silc_server_disconnect_remote(server, sconn->sock,
- SILC_STATUS_ERR_AUTH_FAILED, NULL);
if (sconn->callback)
(*sconn->callback)(server, NULL, sconn->callback_context);
silc_server_free_sock_user_data(server, sconn->sock, NULL);
if (sconn->callback)
(*sconn->callback)(server, NULL, sconn->callback_context);
silc_server_free_sock_user_data(server, sconn->sock, NULL);
- silc_server_
connection_free(sconn);
-
silc_free(entry
);
+ silc_server_
disconnect_remote(server, sconn->sock,
+
SILC_STATUS_ERR_AUTH_FAILED, NULL
);
return;
}
return;
}
@@
-1584,7
+1574,7
@@
static void silc_server_ke_completed(SilcSKE ske, SilcSKEStatus status,
{
SilcPacketStream sock = context;
SilcUnknownEntry entry = silc_packet_get_context(sock);
{
SilcPacketStream sock = context;
SilcUnknownEntry entry = silc_packet_get_context(sock);
- SilcServerConnection sconn =
silc_ske_get_context(ske)
;
+ SilcServerConnection sconn =
entry->data.sconn
;
SilcServer server = entry->server;
SilcServerConfigRouter *conn = sconn->conn.ref_ptr;
SilcAuthMethod auth_meth = SILC_AUTH_NONE;
SilcServer server = entry->server;
SilcServerConfigRouter *conn = sconn->conn.ref_ptr;
SilcAuthMethod auth_meth = SILC_AUTH_NONE;
@@
-1606,12
+1596,11
@@
static void silc_server_ke_completed(SilcSKE ske, SilcSKEStatus status,
/* XXX retry connecting */
silc_ske_free(ske);
/* XXX retry connecting */
silc_ske_free(ske);
- silc_server_disconnect_remote(server, sconn->sock,
- SILC_STATUS_ERR_KEY_EXCHANGE_FAILED, NULL);
if (sconn->callback)
(*sconn->callback)(server, NULL, sconn->callback_context);
silc_server_free_sock_user_data(server, sconn->sock, NULL);
if (sconn->callback)
(*sconn->callback)(server, NULL, sconn->callback_context);
silc_server_free_sock_user_data(server, sconn->sock, NULL);
- silc_server_connection_free(sconn);
+ silc_server_disconnect_remote(server, sconn->sock,
+ SILC_STATUS_ERR_KEY_EXCHANGE_FAILED, NULL);
return;
}
return;
}
@@
-1625,12
+1614,11
@@
static void silc_server_ke_completed(SilcSKE ske, SilcSKEStatus status,
/* Error setting keys */
silc_ske_free(ske);
/* Error setting keys */
silc_ske_free(ske);
- silc_server_disconnect_remote(server, sconn->sock,
- SILC_STATUS_ERR_KEY_EXCHANGE_FAILED, NULL);
if (sconn->callback)
(*sconn->callback)(server, NULL, sconn->callback_context);
silc_server_free_sock_user_data(server, sconn->sock, NULL);
if (sconn->callback)
(*sconn->callback)(server, NULL, sconn->callback_context);
silc_server_free_sock_user_data(server, sconn->sock, NULL);
- silc_server_connection_free(sconn);
+ silc_server_disconnect_remote(server, sconn->sock,
+ SILC_STATUS_ERR_KEY_EXCHANGE_FAILED, NULL);
return;
}
silc_packet_set_keys(sconn->sock, send_key, receive_key, hmac_send,
return;
}
silc_packet_set_keys(sconn->sock, send_key, receive_key, hmac_send,
@@
-1645,12
+1633,11
@@
static void silc_server_ke_completed(SilcSKE ske, SilcSKEStatus status,
/** Error allocating auth protocol */
silc_ske_free(ske);
/** Error allocating auth protocol */
silc_ske_free(ske);
- silc_server_disconnect_remote(server, sconn->sock,
- SILC_STATUS_ERR_RESOURCE_LIMIT, NULL);
if (sconn->callback)
(*sconn->callback)(server, NULL, sconn->callback_context);
silc_server_free_sock_user_data(server, sconn->sock, NULL);
if (sconn->callback)
(*sconn->callback)(server, NULL, sconn->callback_context);
silc_server_free_sock_user_data(server, sconn->sock, NULL);
- silc_server_connection_free(sconn);
+ silc_server_disconnect_remote(server, sconn->sock,
+ SILC_STATUS_ERR_RESOURCE_LIMIT, NULL);
return;
}
return;
}
@@
-1712,9
+1699,9
@@
void silc_server_start_key_exchange(SilcServerConnection sconn)
/* Set source ID to packet stream */
if (!silc_packet_set_ids(sconn->sock, SILC_ID_SERVER, server->id,
0, NULL)) {
/* Set source ID to packet stream */
if (!silc_packet_set_ids(sconn->sock, SILC_ID_SERVER, server->id,
0, NULL)) {
- silc_packet_stream_destroy(sconn->sock);
if (sconn->callback)
(*sconn->callback)(server, NULL, sconn->callback_context);
if (sconn->callback)
(*sconn->callback)(server, NULL, sconn->callback_context);
+ silc_packet_stream_destroy(sconn->sock);
silc_server_connection_free(sconn);
return;
}
silc_server_connection_free(sconn);
return;
}
@@
-1727,6
+1714,7
@@
void silc_server_start_key_exchange(SilcServerConnection sconn)
return;
}
entry->server = server;
return;
}
entry->server = server;
+ entry->data.sconn = sconn;
silc_packet_set_context(sconn->sock, entry);
SILC_LOG_DEBUG(("Created unknown connection %p", entry));
silc_packet_set_context(sconn->sock, entry);
SILC_LOG_DEBUG(("Created unknown connection %p", entry));
@@
-1744,9
+1732,9
@@
void silc_server_start_key_exchange(SilcServerConnection sconn)
server->public_key, server->private_key, sconn);
if (!ske) {
silc_free(entry);
server->public_key, server->private_key, sconn);
if (!ske) {
silc_free(entry);
- silc_packet_stream_destroy(sconn->sock);
if (sconn->callback)
(*sconn->callback)(server, NULL, sconn->callback_context);
if (sconn->callback)
(*sconn->callback)(server, NULL, sconn->callback_context);
+ silc_packet_stream_destroy(sconn->sock);
silc_server_connection_free(sconn);
return;
}
silc_server_connection_free(sconn);
return;
}
@@
-3046,6
+3034,7
@@
void silc_server_free_client_data(SilcServer server,
client->router = NULL;
client->connection = NULL;
client->data.created = silc_time();
client->router = NULL;
client->connection = NULL;
client->data.created = silc_time();
+ silc_dlist_del(server->expired_clients, client);
silc_dlist_add(server->expired_clients, client);
} else {
/* Delete directly since we're shutting down server */
silc_dlist_add(server->expired_clients, client);
} else {
/* Delete directly since we're shutting down server */
@@
-3063,12
+3052,16
@@
void silc_server_free_sock_user_data(SilcServer server,
SilcPacketStream sock,
const char *signoff_message)
{
SilcPacketStream sock,
const char *signoff_message)
{
- SilcIDListData idata
= silc_packet_get_context(sock)
;
+ SilcIDListData idata;
const char *ip;
SilcUInt16 port;
const char *ip;
SilcUInt16 port;
+ if (!sock)
+ return;
+
SILC_LOG_DEBUG(("Start, sock %p", sock));
SILC_LOG_DEBUG(("Start, sock %p", sock));
+ idata = silc_packet_get_context(sock);
if (!idata)
return;
if (!idata)
return;
@@
-3256,8
+3249,10
@@
void silc_server_free_sock_user_data(SilcServer server,
}
server->backup_noswitch = FALSE;
}
server->backup_noswitch = FALSE;
- if (idata->sconn)
+ if (idata->sconn)
{
silc_server_connection_free(idata->sconn);
silc_server_connection_free(idata->sconn);
+ idata->sconn = NULL;
+ }
/* Statistics */
if (idata->conn_type == SILC_CONN_SERVER) {
/* Statistics */
if (idata->conn_type == SILC_CONN_SERVER) {
@@
-3304,6
+3299,12
@@
void silc_server_free_sock_user_data(SilcServer server,
SILC_LOG_DEBUG(("Freeing unknown connection data %p", entry));
if (idata->sconn) {
SILC_LOG_DEBUG(("Freeing unknown connection data %p", entry));
if (idata->sconn) {
+ if (server->router_conn == idata->sconn) {
+ if (!server->no_reconnect)
+ silc_server_create_connections(server);
+ server->router_conn = NULL;
+ }
+
silc_server_connection_free(idata->sconn);
idata->sconn = NULL;
}
silc_server_connection_free(idata->sconn);
idata->sconn = NULL;
}
@@
-3979,6
+3980,7
@@
static void silc_server_announce_get_servers(SilcServer server,
SilcIDCacheEntry id_cache;
SilcServerEntry entry;
SilcBuffer idp;
SilcIDCacheEntry id_cache;
SilcServerEntry entry;
SilcBuffer idp;
+ void *tmp;
/* Go through all clients in the list */
if (silc_idcache_get_all(id_list->servers, &list)) {
/* Go through all clients in the list */
if (silc_idcache_get_all(id_list->servers, &list)) {
@@
-3995,11
+3997,14
@@
static void silc_server_announce_get_servers(SilcServer server,
idp = silc_id_payload_encode(entry->id, SILC_ID_SERVER);
idp = silc_id_payload_encode(entry->id, SILC_ID_SERVER);
- *servers = silc_buffer_realloc(*servers,
- (*servers ?
- silc_buffer_truelen((*servers)) +
- silc_buffer_len(idp) :
- silc_buffer_len(idp)));
+ tmp = silc_buffer_realloc(*servers,
+ (*servers ?
+ silc_buffer_truelen((*servers)) +
+ silc_buffer_len(idp) :
+ silc_buffer_len(idp)));
+ if (!tmp)
+ return;
+ *servers = tmp;
silc_buffer_pull_tail(*servers, ((*servers)->end - (*servers)->data));
silc_buffer_put(*servers, idp->data, silc_buffer_len(idp));
silc_buffer_pull(*servers, silc_buffer_len(idp));
silc_buffer_pull_tail(*servers, ((*servers)->end - (*servers)->data));
silc_buffer_put(*servers, idp->data, silc_buffer_len(idp));
silc_buffer_pull(*servers, silc_buffer_len(idp));
@@
-4073,6
+4078,7
@@
static void silc_server_announce_get_clients(SilcServer server,
SilcBuffer idp;
SilcBuffer tmp;
unsigned char mode[4];
SilcBuffer idp;
SilcBuffer tmp;
unsigned char mode[4];
+ void *tmp2;
/* Go through all clients in the list */
if (silc_idcache_get_all(id_list->clients, &list)) {
/* Go through all clients in the list */
if (silc_idcache_get_all(id_list->clients, &list)) {
@@
-4091,12
+4097,17
@@
static void silc_server_announce_get_clients(SilcServer server,
silc_id_render(client->id, SILC_ID_CLIENT)));
idp = silc_id_payload_encode(client->id, SILC_ID_CLIENT);
silc_id_render(client->id, SILC_ID_CLIENT)));
idp = silc_id_payload_encode(client->id, SILC_ID_CLIENT);
+ if (!idp)
+ return;
- *clients = silc_buffer_realloc(*clients,
- (*clients ?
- silc_buffer_truelen((*clients)) +
- silc_buffer_len(idp) :
- silc_buffer_len(idp)));
+ tmp2 = silc_buffer_realloc(*clients,
+ (*clients ?
+ silc_buffer_truelen((*clients)) +
+ silc_buffer_len(idp) :
+ silc_buffer_len(idp)));
+ if (!tmp2)
+ return;
+ *clients = tmp2;
silc_buffer_pull_tail(*clients, ((*clients)->end - (*clients)->data));
silc_buffer_put(*clients, idp->data, silc_buffer_len(idp));
silc_buffer_pull(*clients, silc_buffer_len(idp));
silc_buffer_pull_tail(*clients, ((*clients)->end - (*clients)->data));
silc_buffer_put(*clients, idp->data, silc_buffer_len(idp));
silc_buffer_pull(*clients, silc_buffer_len(idp));
@@
-4106,11
+4117,14
@@
static void silc_server_announce_get_clients(SilcServer server,
silc_server_announce_encode_notify(SILC_NOTIFY_TYPE_UMODE_CHANGE,
2, idp->data, silc_buffer_len(idp),
mode, 4);
silc_server_announce_encode_notify(SILC_NOTIFY_TYPE_UMODE_CHANGE,
2, idp->data, silc_buffer_len(idp),
mode, 4);
- *umodes = silc_buffer_realloc(*umodes,
- (*umodes ?
- silc_buffer_truelen((*umodes)) +
- silc_buffer_len(tmp) :
- silc_buffer_len(tmp)));
+ tmp2 = silc_buffer_realloc(*umodes,
+ (*umodes ?
+ silc_buffer_truelen((*umodes)) +
+ silc_buffer_len(tmp) :
+ silc_buffer_len(tmp)));
+ if (!tmp2)
+ return;
+ *umodes = tmp2;
silc_buffer_pull_tail(*umodes, ((*umodes)->end - (*umodes)->data));
silc_buffer_put(*umodes, tmp->data, silc_buffer_len(tmp));
silc_buffer_pull(*umodes, silc_buffer_len(tmp));
silc_buffer_pull_tail(*umodes, ((*umodes)->end - (*umodes)->data));
silc_buffer_put(*umodes, tmp->data, silc_buffer_len(tmp));
silc_buffer_pull(*umodes, silc_buffer_len(tmp));
@@
-4266,6
+4280,7
@@
void silc_server_announce_get_channel_users(SilcServer server,
int len;
unsigned char mode[4], ulimit[4];
char *hmac;
int len;
unsigned char mode[4], ulimit[4];
char *hmac;
+ void *tmp2;
SILC_LOG_DEBUG(("Start"));
SILC_LOG_DEBUG(("Start"));
@@
-4302,10
+4317,13
@@
void silc_server_announce_get_channel_users(SilcServer server,
SILC_CHANNEL_MODE_ULIMIT ?
sizeof(ulimit) : 0));
len = silc_buffer_len(tmp);
SILC_CHANNEL_MODE_ULIMIT ?
sizeof(ulimit) : 0));
len = silc_buffer_len(tmp);
-
*channel_modes
=
+
tmp2
=
silc_buffer_realloc(*channel_modes,
(*channel_modes ?
silc_buffer_truelen((*channel_modes)) + len : len));
silc_buffer_realloc(*channel_modes,
(*channel_modes ?
silc_buffer_truelen((*channel_modes)) + len : len));
+ if (!tmp2)
+ return;
+ *channel_modes = tmp2;
silc_buffer_pull_tail(*channel_modes,
((*channel_modes)->end -
(*channel_modes)->data));
silc_buffer_pull_tail(*channel_modes,
((*channel_modes)->end -
(*channel_modes)->data));
@@
-4330,10
+4348,13
@@
void silc_server_announce_get_channel_users(SilcServer server,
chidp->data,
silc_buffer_len(chidp));
len = silc_buffer_len(tmp);
chidp->data,
silc_buffer_len(chidp));
len = silc_buffer_len(tmp);
-
*channel_users
=
+
tmp2
=
silc_buffer_realloc(*channel_users,
(*channel_users ?
silc_buffer_truelen((*channel_users)) + len : len));
silc_buffer_realloc(*channel_users,
(*channel_users ?
silc_buffer_truelen((*channel_users)) + len : len));
+ if (!tmp2)
+ return;
+ *channel_users = tmp2;
silc_buffer_pull_tail(*channel_users,
((*channel_users)->end -
(*channel_users)->data));
silc_buffer_pull_tail(*channel_users,
((*channel_users)->end -
(*channel_users)->data));
@@
-4355,11
+4376,14
@@
void silc_server_announce_get_channel_users(SilcServer server,
fkey ? fkey->data : NULL,
fkey ? silc_buffer_len(fkey) : 0);
len = silc_buffer_len(tmp);
fkey ? fkey->data : NULL,
fkey ? silc_buffer_len(fkey) : 0);
len = silc_buffer_len(tmp);
-
*channel_users_modes
=
+
tmp2
=
silc_buffer_realloc(*channel_users_modes,
(*channel_users_modes ?
silc_buffer_truelen((*channel_users_modes)) +
len : len));
silc_buffer_realloc(*channel_users_modes,
(*channel_users_modes ?
silc_buffer_truelen((*channel_users_modes)) +
len : len));
+ if (!tmp2)
+ return;
+ *channel_users_modes = tmp2;
silc_buffer_pull_tail(*channel_users_modes,
((*channel_users_modes)->end -
(*channel_users_modes)->data));
silc_buffer_pull_tail(*channel_users_modes,
((*channel_users_modes)->end -
(*channel_users_modes)->data));
@@
-4401,6
+4425,7
@@
void silc_server_announce_get_channels(SilcServer server,
SilcUInt16 name_len;
int len;
int i = *channel_users_modes_c;
SilcUInt16 name_len;
int len;
int i = *channel_users_modes_c;
+ void *tmp;
SilcBool announce;
SILC_LOG_DEBUG(("Start"));
SilcBool announce;
SILC_LOG_DEBUG(("Start"));
@@
-4424,11
+4449,15
@@
void silc_server_announce_get_channels(SilcServer server,
if (announce) {
len = 4 + name_len + id_len + 4;
if (announce) {
len = 4 + name_len + id_len + 4;
-
*channels
=
+
tmp
=
silc_buffer_realloc(*channels,
(*channels ?
silc_buffer_truelen((*channels)) +
len : len));
silc_buffer_realloc(*channels,
(*channels ?
silc_buffer_truelen((*channels)) +
len : len));
+ if (!tmp)
+ break;
+ *channels = tmp;
+
silc_buffer_pull_tail(*channels,
((*channels)->end - (*channels)->data));
silc_buffer_format(*channels,
silc_buffer_pull_tail(*channels,
((*channels)->end - (*channels)->data));
silc_buffer_format(*channels,
@@
-4449,15
+4478,23
@@
void silc_server_announce_get_channels(SilcServer server,
if (announce) {
/* Channel user modes */
if (announce) {
/* Channel user modes */
- *channel_users_modes = silc_realloc(*channel_users_modes,
- sizeof(**channel_users_modes) *
- (i + 1));
+ tmp = silc_realloc(*channel_users_modes,
+ sizeof(**channel_users_modes) * (i + 1));
+ if (!tmp)
+ break;
+ *channel_users_modes = tmp;
(*channel_users_modes)[i] = NULL;
(*channel_users_modes)[i] = NULL;
- *channel_modes = silc_realloc(*channel_modes,
- sizeof(**channel_modes) * (i + 1));
+ tmp = silc_realloc(*channel_modes,
+ sizeof(**channel_modes) * (i + 1));
+ if (!tmp)
+ break;
+ *channel_modes = tmp;
(*channel_modes)[i] = NULL;
(*channel_modes)[i] = NULL;
- *channel_ids = silc_realloc(*channel_ids,
- sizeof(**channel_ids) * (i + 1));
+ tmp = silc_realloc(*channel_ids,
+ sizeof(**channel_ids) * (i + 1));
+ if (!tmp)
+ break;
+ *channel_ids = tmp;
(*channel_ids)[i] = NULL;
silc_server_announce_get_channel_users(server, channel,
&(*channel_modes)[i],
(*channel_ids)[i] = NULL;
silc_server_announce_get_channel_users(server, channel,
&(*channel_modes)[i],
@@
-4466,18
+4503,27
@@
void silc_server_announce_get_channels(SilcServer server,
(*channel_ids)[i] = channel->id;
/* Channel's topic */
(*channel_ids)[i] = channel->id;
/* Channel's topic */
- *channel_topics = silc_realloc(*channel_topics,
- sizeof(**channel_topics) * (i + 1));
+ tmp = silc_realloc(*channel_topics,
+ sizeof(**channel_topics) * (i + 1));
+ if (!tmp)
+ break;
+ *channel_topics = tmp;
(*channel_topics)[i] = NULL;
silc_server_announce_get_channel_topic(server, channel,
&(*channel_topics)[i]);
/* Channel's invite and ban list */
(*channel_topics)[i] = NULL;
silc_server_announce_get_channel_topic(server, channel,
&(*channel_topics)[i]);
/* Channel's invite and ban list */
- *channel_invites = silc_realloc(*channel_invites,
- sizeof(**channel_invites) * (i + 1));
+ tmp = silc_realloc(*channel_invites,
+ sizeof(**channel_invites) * (i + 1));
+ if (!tmp)
+ break;
+ *channel_invites = tmp;
(*channel_invites)[i] = NULL;
(*channel_invites)[i] = NULL;
- *channel_bans = silc_realloc(*channel_bans,
- sizeof(**channel_bans) * (i + 1));
+ tmp = silc_realloc(*channel_bans,
+ sizeof(**channel_bans) * (i + 1));
+ if (!tmp)
+ break;
+ *channel_bans = tmp;
(*channel_bans)[i] = NULL;
silc_server_announce_get_inviteban(server, channel,
&(*channel_invites)[i],
(*channel_bans)[i] = NULL;
silc_server_announce_get_inviteban(server, channel,
&(*channel_invites)[i],