From: Pekka Riikonen Date: Sat, 13 Dec 2008 16:18:20 +0000 (+0200) Subject: Merge branch 'topic/serverlink-fixes' of git://valera-ext.nynaeve.net/silc into silc... X-Git-Tag: silc.toolkit.1.1.9~11 X-Git-Url: http://git.silcnet.org/gitweb/?a=commitdiff_plain;h=ef4e36360505da6c96404d6c762dcd6773fdb98f;hp=85f7454c353763cb25aa719409e656bfd8d878df;p=silc.git Merge branch 'topic/serverlink-fixes' of git://valera-ext.nynaeve.net/silc into silc.1.1.branch Additional changes: - Do not register packet error timeout multiple times - Added padding length sanity checks to packet engine - Removed old unused macros from silcd --- diff --git a/apps/silcd/server.c b/apps/silcd/server.c index 6cef2417..777d7243 100644 --- a/apps/silcd/server.c +++ b/apps/silcd/server.c @@ -283,9 +283,14 @@ static void silc_server_packet_error(SilcPacketEngine engine, if (!silc_packet_stream_is_valid(stream)) return; + /* In case we get here many times, register only one timeout */ + silc_schedule_task_del_by_all(server->schedule, 0, + silc_server_packet_error_timeout, stream); + + /* Close connection with random timeout */ silc_schedule_task_add_timeout(server->schedule, silc_server_packet_error_timeout, stream, - silc_rng_get_byte(server->rng) % 5, 0); + silc_rng_get_byte(server->rng) % 10, 0); } /* Packet stream callbacks */ diff --git a/apps/silcd/server_internal.h b/apps/silcd/server_internal.h index fd948ffe..09257e66 100644 --- a/apps/silcd/server_internal.h +++ b/apps/silcd/server_internal.h @@ -166,29 +166,6 @@ typedef struct { #define SILC_IS_LOCAL(entry) \ (((SilcIDListData)entry)->status & SILC_IDLIST_STATUS_LOCAL) -/* Registers generic task for file descriptor for reading from network and - writing to network. As being generic task the actual task is allocated - only once and after that the same task applies to all registered fd's. */ -#define SILC_REGISTER_CONNECTION_FOR_IO(fd) \ -do { \ - silc_schedule_task_add(server->schedule, (fd), \ - silc_server_packet_process, \ - context, 0, 0, \ - SILC_TASK_GENERIC, \ - SILC_TASK_PRI_NORMAL); \ -} while(0) - -#define SILC_SET_CONNECTION_FOR_INPUT(s, fd) \ -do { \ - silc_schedule_set_listen_fd((s), (fd), SILC_TASK_READ, FALSE); \ -} while(0) - -#define SILC_SET_CONNECTION_FOR_OUTPUT(s, fd) \ -do { \ - silc_schedule_set_listen_fd((s), (fd), (SILC_TASK_READ | SILC_TASK_WRITE), \ - FALSE); \ -} while(0) - #define SILC_OPER_STATS_UPDATE(c, type, mod) \ do { \ if ((c)->mode & (mod)) { \ diff --git a/lib/silccore/silcpacket.c b/lib/silccore/silcpacket.c index 8b68c5ed..9a44f87c 100644 --- a/lib/silccore/silcpacket.c +++ b/lib/silccore/silcpacket.c @@ -2197,6 +2197,17 @@ static void silc_packet_read_process(SilcPacketStream stream) /* Get packet length and full packet length with padding */ SILC_PACKET_LENGTH(header, packetlen, paddedlen); + /* Padding sanity checks */ + if (cipher && (paddedlen % block_len) != 0) { + SILC_LOG_DEBUG(("Packet length %d not multiple by cipher block length", + paddedlen)); + silc_mutex_unlock(stream->lock); + SILC_PACKET_CALLBACK_ERROR(stream, SILC_PACKET_ERR_MALFORMED); + silc_mutex_lock(stream->lock); + memset(tmp, 0, sizeof(tmp)); + goto out; + } + if (silc_buffer_len(inbuf) < paddedlen + ivlen + mac_len) { SILC_LOG_DEBUG(("Received partial packet, waiting for the rest " "(%d bytes)",