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/?p=silc.git;a=commitdiff_plain;h=ef4e36360505da6c96404d6c762dcd6773fdb98f 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 --- ef4e36360505da6c96404d6c762dcd6773fdb98f diff --cc apps/silcd/server.c index dad1a44e,6cef2417..777d7243 --- a/apps/silcd/server.c +++ b/apps/silcd/server.c @@@ -280,9 -283,9 +283,14 @@@ static void silc_server_packet_error(Si 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 --cc apps/silcd/server_internal.h index fd948ffe,fd948ffe..09257e66 --- a/apps/silcd/server_internal.h +++ b/apps/silcd/server_internal.h @@@ -166,29 -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 --cc lib/silccore/silcpacket.c index 8b68c5ed,8b68c5ed..9a44f87c --- a/lib/silccore/silcpacket.c +++ b/lib/silccore/silcpacket.c @@@ -2197,6 -2197,6 +2197,17 @@@ static void silc_packet_read_process(Si /* 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)",