diff options
| author | Alexander Barton <alex@barton.de> | 2020-05-01 23:55:28 +0200 |
|---|---|---|
| committer | Alexander Barton <alex@barton.de> | 2020-05-04 00:46:56 +0200 |
| commit | 54fac576030d7aaf8bce4a982c880fe18680741e (patch) | |
| tree | 7715b4df4c1ffecb7161f0999422af77af11c65a | |
| parent | 9f05f5ee61d23292d55edef09439c38936b86037 (diff) | |
| download | ngircd-54fac576030d7aaf8bce4a982c880fe18680741e.tar.gz ngircd-54fac576030d7aaf8bce4a982c880fe18680741e.zip | |
Handle commands in the read buffer before reading more data
If there are more bytes in the read buffer already than a single valid IRC command can get long (513 bytes, COMMAND_LEN), wait for this/those command(s) to be handled first and don't try to read even more data from the network (which most probably would overflow the read buffer of this connection soon).
| -rw-r--r-- | src/ngircd/conn.c | 17 |
1 files changed, 16 insertions, 1 deletions
diff --git a/src/ngircd/conn.c b/src/ngircd/conn.c index 7d1576e1..ca7030f4 100644 --- a/src/ngircd/conn.c +++ b/src/ngircd/conn.c @@ -734,6 +734,18 @@ Conn_Handler(void) continue; } + if (array_bytes(&My_Connections[i].rbuf) >= COMMAND_LEN) { + /* There is still more data in the read buffer + * than a single valid command can get long: + * so either there is a complete command, or + * invalid data. Therefore don't try to read in + * even more data from the network but wait for + * this command(s) to be handled first! */ + io_event_del(My_Connections[i].sock, + IO_WANTREAD); + continue; + } + io_event_add(My_Connections[i].sock, IO_WANTREAD); } @@ -1554,6 +1566,10 @@ Read_Request(CONN_ID Idx) assert(Idx > NONE); assert(My_Connections[Idx].sock > NONE); + /* Check if the read buffer is "full". Basically this shouldn't happen + * here, because as long as there possibly are commands in the read + * buffer (buffer usage > COMMAND_LEN), the socket shouldn't be + * scheduled for reading in Conn_Handler() at all ... */ #ifdef ZLIB if ((array_bytes(&My_Connections[Idx].rbuf) >= READBUFFER_LEN) || (array_bytes(&My_Connections[Idx].zip.rbuf) >= READBUFFER_LEN)) @@ -1561,7 +1577,6 @@ Read_Request(CONN_ID Idx) if (array_bytes(&My_Connections[Idx].rbuf) >= READBUFFER_LEN) #endif { - /* Read buffer is full */ Log(LOG_ERR, "Receive buffer space exhausted (connection %d): %d/%d bytes", Idx, array_bytes(&My_Connections[Idx].rbuf), READBUFFER_LEN); |