X-Git-Url: https://jfr.im/git/solanum.git/blobdiff_plain/ff12cc94790de2e87e78ee7aa378f21fa415d73c..93035e75d97cddcd7d49f95e7bd0d8139e12f17f:/ircd/packet.c diff --git a/ircd/packet.c b/ircd/packet.c index fe18b1df..ee842955 100644 --- a/ircd/packet.c +++ b/ircd/packet.c @@ -20,14 +20,11 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 * USA - * - * $Id: packet.c 3446 2007-05-14 22:21:16Z jilles $ */ #include "stdinc.h" #include "s_conf.h" #include "s_serv.h" #include "client.h" -#include "common.h" #include "ircd.h" #include "parse.h" #include "packet.h" @@ -35,6 +32,7 @@ #include "hook.h" #include "send.h" #include "s_assert.h" +#include "s_newconf.h" static char readBuf[READBUF_SIZE]; static void client_dopacket(struct Client *client_p, char *buffer, size_t length); @@ -111,7 +109,7 @@ parse_client_queued(struct Client *client_p) /* allow opers 4 times the amount of messages as users. why 4? * why not. :) --fl_ */ - if(IsOper(client_p) && ConfigFileEntry.no_oper_flood) + if(IsOperGeneral(client_p) && ConfigFileEntry.no_oper_flood) allow_read *= 4; /* * Handle flood protection here - if we exceed our flood limit on @@ -136,6 +134,12 @@ parse_client_queued(struct Client *client_p) if(client_p->localClient->sent_parsed >= allow_read) break; + /* post_registration_delay hack. Don't process any messages from a new client for $n seconds, + * to allow network bots to do their thing before channels can be joined. + */ + if (rb_current_time() < client_p->localClient->firsttime + ConfigFileEntry.post_registration_delay) + break; + dolen = rb_linebuf_get(&client_p->localClient-> buf_recvq, readBuf, READBUF_SIZE, LINEBUF_COMPLETE, LINEBUF_PARSED); @@ -235,11 +239,7 @@ read_packet(rb_fde_t * F, void *data) { struct Client *client_p = data; int length = 0; - int binary = 0; -#ifdef USE_IODEBUG_HOOKS - hook_data_int hdata; -#endif while(1) { @@ -268,13 +268,6 @@ read_packet(rb_fde_t * F, void *data) return; } -#ifdef USE_IODEBUG_HOOKS - hdata.client = client_p; - hdata.arg1 = readBuf; - hdata.arg2 = length; - call_hook(h_iorecv_id, &hdata); -#endif - if(client_p->localClient->lasttime < rb_current_time()) client_p->localClient->lasttime = rb_current_time(); client_p->flags &= ~FLAGS_PINGSENT; @@ -302,16 +295,15 @@ read_packet(rb_fde_t * F, void *data) if(!IsAnyServer(client_p) && (rb_linebuf_alloclen(&client_p->localClient->buf_recvq) > ConfigFileEntry.client_flood_max_lines)) { - if(!(ConfigFileEntry.no_oper_flood && IsOper(client_p))) + if(!(ConfigFileEntry.no_oper_flood && IsOperGeneral(client_p))) { exit_client(client_p, client_p, client_p, "Excess Flood"); return; } } - /* bail if short read */ - if(length < READBUF_SIZE) - { + /* bail if short read, but not for SCTP as it returns data in packets */ + if (length < READBUF_SIZE && !(rb_get_type(client_p->localClient->F) & RB_FD_SCTP)) { rb_setselect(client_p->localClient->F, RB_SELECT_READ, read_packet, client_p); return; } @@ -330,7 +322,7 @@ read_packet(rb_fde_t * F, void *data) * with client_p of "local" variation, which contains all the * necessary fields (buffer etc..) */ -void +static void client_dopacket(struct Client *client_p, char *buffer, size_t length) { s_assert(client_p != NULL);