commit - 04de1423eb26da60c192d343a7e7a6bcda2aca37
commit + c6e3c13f27744971fcb1d2de4e561d3bcdaa5aed
blob - 92d9939ab291445e53806b75609dfaa8209915ad
blob + ef0f95fa73e8912d8e349d7c0ba71c5bd81c836d
--- src/ngircd/conn.c
+++ src/ngircd/conn.c
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 );
-#ifdef ZLIB
- if ((array_bytes(&My_Connections[Idx].rbuf) >= READBUFFER_LEN) ||
- (array_bytes(&My_Connections[Idx].zip.rbuf) >= READBUFFER_LEN))
+ /* 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) >= 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,
blob - ff8cd226d641b0dced4b398438b74c14f2df983a
blob + 7ce30e572862f8cd04fb05ced54ec4d072e53e47
--- src/ngircd/defines.h
+++ src/ngircd/defines.h
/** 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
#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 */