about summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--src/ngircd/conn.c26
-rw-r--r--src/ngircd/defines.h8
2 files changed, 26 insertions, 8 deletions
diff --git a/src/ngircd/conn.c b/src/ngircd/conn.c
index 92d9939a..ef0f95fa 100644
--- a/src/ngircd/conn.c
+++ b/src/ngircd/conn.c
@@ -1546,34 +1546,46 @@ static void
 Read_Request( CONN_ID Idx )
 {
 	ssize_t len;
+	size_t readbuf_limit = READBUFFER_LEN;
 	static const unsigned int maxbps = COMMAND_LEN / 2;
-	char readbuf[READBUFFER_LEN];
+	char readbuf[READBUFFER_MAX_LEN];
 	time_t t;
 	CLIENT *c;
 	assert( Idx > NONE );
 	assert( My_Connections[Idx].sock > NONE );
 
+	/* Make sure that there still exists a CLIENT structure associated
+	 * with this connection and check if this is a server or not: */
+	c = Conn_GetClient(Idx);
+	if (c) {
+		/* Servers do get special read buffer limits, so they can
+		 * process all the messages that are required while peering. */
+		if (Client_Type(c) == CLIENT_SERVER)
+			readbuf_limit = READBUFFER_SLINK_LEN;
+	} else
+		LogDebug("Read request without client (connection %d)!?", Idx);
+
 #ifdef ZLIB
-	if ((array_bytes(&My_Connections[Idx].rbuf) >= READBUFFER_LEN) ||
-		(array_bytes(&My_Connections[Idx].zip.rbuf) >= READBUFFER_LEN))
+	if ((array_bytes(&My_Connections[Idx].rbuf) >= readbuf_limit) ||
+		(array_bytes(&My_Connections[Idx].zip.rbuf) >= readbuf_limit))
 #else
-	if (array_bytes(&My_Connections[Idx].rbuf) >= READBUFFER_LEN)
+	if (array_bytes(&My_Connections[Idx].rbuf) >= readbuf_limit)
 #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);
+		    Idx, array_bytes(&My_Connections[Idx].rbuf), readbuf_limit);
 		Conn_Close(Idx, "Receive buffer space exhausted", NULL, false);
 		return;
 	}
 
 #ifdef SSL_SUPPORT
 	if (Conn_OPTION_ISSET(&My_Connections[Idx], CONN_SSL))
-		len = ConnSSL_Read( &My_Connections[Idx], readbuf, sizeof(readbuf));
+		len = ConnSSL_Read( &My_Connections[Idx], readbuf, readbuf_limit);
 	else
 #endif
-	len = read(My_Connections[Idx].sock, readbuf, sizeof(readbuf));
+	len = read(My_Connections[Idx].sock, readbuf, readbuf_limit);
 	if (len == 0) {
 		LogDebug("Client \"%s:%u\" is closing connection %d ...",
 			 My_Connections[Idx].host,
diff --git a/src/ngircd/defines.h b/src/ngircd/defines.h
index ff8cd226..7ce30e57 100644
--- a/src/ngircd/defines.h
+++ b/src/ngircd/defines.h
@@ -153,6 +153,12 @@
 /** Size of the read buffer of a connection in bytes. */
 #define READBUFFER_LEN 2048
 
+/** Maximum size of the read buffer of a connection in bytes. */
+#define READBUFFER_MAX_LEN 65535
+
+/** Maximum size of the read buffer of a server link connection in bytes. */
+#define READBUFFER_SLINK_LEN 65536
+
 /** Size that triggers write buffer flushing if more space is needed. */
 #define WRITEBUFFER_FLUSH_LEN 4096
 
@@ -160,7 +166,7 @@
 #define WRITEBUFFER_MAX_LEN 32768
 
 /** Maximum size of the write buffer of a server link connection in bytes. */
-#define WRITEBUFFER_SLINK_LEN 65536
+#define WRITEBUFFER_SLINK_LEN READBUFFER_SLINK_LEN
 
 
 /* IRC/IRC+ protocol */