summary refs log tree commit diff
path: root/src
diff options
context:
space:
mode:
authorAlexander Barton <alex@barton.de>2020-05-01 23:55:28 +0200
committerAlexander Barton <alex@barton.de>2020-05-04 00:46:56 +0200
commit54fac576030d7aaf8bce4a982c880fe18680741e (patch)
tree7715b4df4c1ffecb7161f0999422af77af11c65a /src
parent9f05f5ee61d23292d55edef09439c38936b86037 (diff)
downloadngircd-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).
Diffstat (limited to 'src')
-rw-r--r--src/ngircd/conn.c17
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);