]> arthur.barton.de Git - ngircd-alex.git/commitdiff
remove ZBUFFER constants and increase max buffer size of server links
authorFlorian Westphal <fw@strlen.de>
Wed, 9 May 2007 08:55:14 +0000 (08:55 +0000)
committerFlorian Westphal <fw@strlen.de>
Wed, 9 May 2007 08:55:14 +0000 (08:55 +0000)
src/ngircd/conn-zip.c
src/ngircd/conn.c
src/ngircd/defines.h

index 2421e10737b03e4c3cf740012e5c7f5b7c8c0557..28abcdd269f333bc2558d4d7c57e8626c7071b81 100644 (file)
@@ -22,7 +22,7 @@
 /* enable more zlib related debug messages: */
 /* #define DEBUG_ZLIB */
 
 /* enable more zlib related debug messages: */
 /* #define DEBUG_ZLIB */
 
-static char UNUSED id[] = "$Id: conn-zip.c,v 1.11 2006/07/23 15:19:20 alex Exp $";
+static char UNUSED id[] = "$Id: conn-zip.c,v 1.12 2007/05/09 08:55:14 fw Exp $";
 
 #include "imp.h"
 #include <assert.h>
 
 #include "imp.h"
 #include <assert.h>
@@ -85,22 +85,23 @@ Zip_InitConn( CONN_ID Idx )
 GLOBAL bool
 Zip_Buffer( CONN_ID Idx, char *Data, size_t Len )
 {
 GLOBAL bool
 Zip_Buffer( CONN_ID Idx, char *Data, size_t Len )
 {
-       /* Daten zum Komprimieren im "Kompressions-Puffer" sammeln.
-       * Es wird true bei Erfolg, sonst false geliefert. */
+       size_t buflen;
 
        assert( Idx > NONE );
        assert( Data != NULL );
        assert( Len > 0 );
 
        assert( Idx > NONE );
        assert( Data != NULL );
        assert( Len > 0 );
-       assert( Len <= ZWRITEBUFFER_LEN );
-
-       if (Len > ZWRITEBUFFER_LEN)
-               return false;
 
 
-       if ( array_bytes( &My_Connections[Idx].zip.wbuf ) >= ZWRITEBUFFER_LEN ) {
+       buflen = array_bytes(&My_Connections[Idx].zip.wbuf);
+       if (buflen >= WRITEBUFFER_LEN) {
                /* compression buffer is full, flush */
                if( ! Zip_Flush( Idx )) return false;
        }
 
                /* compression buffer is full, flush */
                if( ! Zip_Flush( Idx )) return false;
        }
 
+       /* check again; if zip buf is still too large do not append data:
+        * otherwise the zip wbuf would grow too large */
+       buflen = array_bytes(&My_Connections[Idx].zip.wbuf);
+       if (buflen >= WRITEBUFFER_LEN)
+               return false;
        return array_catb(&My_Connections[Idx].zip.wbuf, Data, Len);
 } /* Zip_Buffer */
 
        return array_catb(&My_Connections[Idx].zip.wbuf, Data, Len);
 } /* Zip_Buffer */
 
@@ -140,6 +141,7 @@ Zip_Flush( CONN_ID Idx )
        }
 
        assert(out->avail_out <= WRITEBUFFER_LEN);
        }
 
        assert(out->avail_out <= WRITEBUFFER_LEN);
+       assert(out->avail_out > 0); /* 0 might indicate not all data was compressed... */
        zipbuf_used = WRITEBUFFER_LEN - out->avail_out;
 #ifdef DEBUG_ZIP
        Log(LOG_DEBUG, "zipbuf_used: %d", zipbuf_used);
        zipbuf_used = WRITEBUFFER_LEN - out->avail_out;
 #ifdef DEBUG_ZIP
        Log(LOG_DEBUG, "zipbuf_used: %d", zipbuf_used);
index 54f09a5c8d97a78131ac9aaf0c47d0c52699b1e9..513c3c70768b0fc60aa70f12f3e8560c0ef73f07 100644 (file)
@@ -17,7 +17,7 @@
 #include "portab.h"
 #include "io.h"
 
 #include "portab.h"
 #include "io.h"
 
-static char UNUSED id[] = "$Id: conn.c,v 1.205 2007/05/02 12:34:31 fw Exp $";
+static char UNUSED id[] = "$Id: conn.c,v 1.206 2007/05/09 08:55:14 fw Exp $";
 
 #include "imp.h"
 #include <assert.h>
 
 #include "imp.h"
 #include <assert.h>
@@ -613,10 +613,16 @@ Conn_Write( CONN_ID Idx, char *Data, size_t Len )
        /* Daten in Socket schreiben. Bei "fatalen" Fehlern wird
         * der Client disconnectiert und false geliefert. */
 
        /* Daten in Socket schreiben. Bei "fatalen" Fehlern wird
         * der Client disconnectiert und false geliefert. */
 
+       CLIENT *c;
+       size_t writebuf_limit = WRITEBUFFER_LEN;
        assert( Idx > NONE );
        assert( Data != NULL );
        assert( Len > 0 );
 
        assert( Idx > NONE );
        assert( Data != NULL );
        assert( Len > 0 );
 
+       c = Conn_GetClient(Idx);
+       assert( c != NULL);
+       if (Client_Type(c) == CLIENT_SERVER)
+               writebuf_limit = WRITEBUFFER_LEN * 10;
        /* Ist der entsprechende Socket ueberhaupt noch offen? In einem
         * "Handler-Durchlauf" kann es passieren, dass dem nicht mehr so
         * ist, wenn einer von mehreren Conn_Write()'s fehlgeschlagen ist.
        /* Ist der entsprechende Socket ueberhaupt noch offen? In einem
         * "Handler-Durchlauf" kann es passieren, dass dem nicht mehr so
         * ist, wenn einer von mehreren Conn_Write()'s fehlgeschlagen ist.
@@ -629,14 +635,15 @@ Conn_Write( CONN_ID Idx, char *Data, size_t Len )
        /* Pruefen, ob im Schreibpuffer genuegend Platz ist. Ziel ist es,
         * moeglichts viel im Puffer zu haben und _nicht_ gleich alles auf den
         * Socket zu schreiben (u.a. wg. Komprimierung). */
        /* Pruefen, ob im Schreibpuffer genuegend Platz ist. Ziel ist es,
         * moeglichts viel im Puffer zu haben und _nicht_ gleich alles auf den
         * Socket zu schreiben (u.a. wg. Komprimierung). */
-       if( array_bytes(&My_Connections[Idx].wbuf) >= WRITEBUFFER_LEN) {
+       if (array_bytes(&My_Connections[Idx].wbuf) >= writebuf_limit) {
                /* Der Puffer ist dummerweise voll. Jetzt versuchen, den Puffer
                 * zu schreiben, wenn das nicht klappt, haben wir ein Problem ... */
                if( ! Handle_Write( Idx )) return false;
 
                /* check again: if our writebuf is twice als large as the initial limit: Kill connection */
                /* Der Puffer ist dummerweise voll. Jetzt versuchen, den Puffer
                 * zu schreiben, wenn das nicht klappt, haben wir ein Problem ... */
                if( ! Handle_Write( Idx )) return false;
 
                /* check again: if our writebuf is twice als large as the initial limit: Kill connection */
-               if( array_bytes(&My_Connections[Idx].wbuf) >= (WRITEBUFFER_LEN*2)) {
-                       Log( LOG_NOTICE, "Write buffer overflow (connection %d)!", Idx );
+               if (array_bytes(&My_Connections[Idx].wbuf) >= (writebuf_limit*2)) {
+                       Log(LOG_NOTICE, "Write buffer overflow (connection %d, size %lu byte)!", Idx,
+                                       (unsigned long) array_bytes(&My_Connections[Idx].wbuf));
                        Conn_Close( Idx, "Write buffer overflow!", NULL, false );
                        return false;
                }
                        Conn_Close( Idx, "Write buffer overflow!", NULL, false );
                        return false;
                }
@@ -1048,18 +1055,22 @@ Read_Request( CONN_ID Idx )
        /* Daten von Socket einlesen und entsprechend behandeln.
         * Tritt ein Fehler auf, so wird der Socket geschlossen. */
 
        /* Daten von Socket einlesen und entsprechend behandeln.
         * Tritt ein Fehler auf, so wird der Socket geschlossen. */
 
+       size_t readbuf_limit = READBUFFER_LEN;
        ssize_t len;
        ssize_t len;
-       char readbuf[1024];
+       char readbuf[READBUFFER_LEN];
        CLIENT *c;
        CLIENT *c;
-
        assert( Idx > NONE );
        assert( My_Connections[Idx].sock > NONE );
 
        assert( Idx > NONE );
        assert( My_Connections[Idx].sock > NONE );
 
+       c = Conn_GetClient(Idx);
+       assert ( c != NULL);
+       if (Client_Type(c) == CLIENT_SERVER)
+               readbuf_limit = READBUFFER_LEN * 10;
 #ifdef ZLIB
 #ifdef ZLIB
-       if (( array_bytes(&My_Connections[Idx].rbuf) >= READBUFFER_LEN ) ||
-               ( array_bytes(&My_Connections[Idx].zip.rbuf) >= ZREADBUFFER_LEN ))
+       if ((array_bytes(&My_Connections[Idx].rbuf) >= readbuf_limit) ||
+               (array_bytes(&My_Connections[Idx].zip.rbuf) >= readbuf_limit))
 #else
 #else
-       if ( array_bytes(&My_Connections[Idx].rbuf) >= READBUFFER_LEN )
+       if (array_bytes(&My_Connections[Idx].rbuf) >= readbuf_limit)
 #endif
        {
                /* Der Lesepuffer ist voll */
 #endif
        {
                /* Der Lesepuffer ist voll */
@@ -1069,7 +1080,7 @@ Read_Request( CONN_ID Idx )
                return;
        }
 
                return;
        }
 
-       len = read( My_Connections[Idx].sock, readbuf, sizeof readbuf -1 );
+       len = read(My_Connections[Idx].sock, readbuf, sizeof(readbuf));
        if( len == 0 ) {
                Log( LOG_INFO, "%s:%d (%s) is closing the connection ...",
                        My_Connections[Idx].host, ntohs( My_Connections[Idx].addr.sin_port),
        if( len == 0 ) {
                Log( LOG_INFO, "%s:%d (%s) is closing the connection ...",
                        My_Connections[Idx].host, ntohs( My_Connections[Idx].addr.sin_port),
@@ -1218,11 +1229,6 @@ Handle_Buffer( CONN_ID Idx )
                        /* The last Command activated Socket-Compression.
                         * Data that was read after that needs to be copied to Unzip-buf
                         * for decompression */
                        /* The last Command activated Socket-Compression.
                         * Data that was read after that needs to be copied to Unzip-buf
                         * for decompression */
-                       if( array_bytes(&My_Connections[Idx].rbuf)> ZREADBUFFER_LEN ) {
-                               Log( LOG_ALERT, "Connection %d: No space left in unzip buf (need %u bytes)!",
-                                                               Idx, array_bytes(&My_Connections[Idx].rbuf ));
-                               return false;
-                       }
                        if (!array_copy( &My_Connections[Idx].zip.rbuf, &My_Connections[Idx].rbuf ))
                                return false;
 
                        if (!array_copy( &My_Connections[Idx].zip.rbuf, &My_Connections[Idx].rbuf ))
                                return false;
 
index 5f98e806b806754f9abc0b70ae317b757d2bdf09..b25ab1b5c1ea02eec64c85e0ebb8bda6c8514b35 100644 (file)
@@ -8,7 +8,7 @@
  * (at your option) any later version.
  * Please read the file COPYING, README and AUTHORS for more information.
  *
  * (at your option) any later version.
  * Please read the file COPYING, README and AUTHORS for more information.
  *
- * $Id: defines.h,v 1.58 2006/06/15 20:28:15 alex Exp $
+ * $Id: defines.h,v 1.59 2007/05/09 08:55:14 fw Exp $
  */
 
 
  */
 
 
 #define COMMAND_LEN 513                        /* Max. IRC command length, see. RFC
                                           2812 section 3.2 */
 
 #define COMMAND_LEN 513                        /* Max. IRC command length, see. RFC
                                           2812 section 3.2 */
 
-#define READBUFFER_LEN 2048            /* Size of the read buffer of a
+#define READBUFFER_LEN 4096            /* Size of the read buffer of a
                                           connection in bytes. */
 #define WRITEBUFFER_LEN 4096           /* Size of the write buffer of a
                                           connection in bytes. */
 
                                           connection in bytes. */
 #define WRITEBUFFER_LEN 4096           /* Size of the write buffer of a
                                           connection in bytes. */
 
-#ifdef ZLIB
-#define ZREADBUFFER_LEN 1024           /* Size of the compressed read buffer
-                                          of a connection in bytes. */
-#define ZWRITEBUFFER_LEN 4096          /* Size of the compressed write buffer
-                                          of a connection in bytes. */
-#endif
-
 #define PROTOVER "0210"                        /* Implemented IRC protocol version,
                                           see RFC 2813 section 4.1.1. */
 #define PROTOIRC "-IRC"                        /* Protocol suffix, see RFC 2813
 #define PROTOVER "0210"                        /* Implemented IRC protocol version,
                                           see RFC 2813 section 4.1.1. */
 #define PROTOIRC "-IRC"                        /* Protocol suffix, see RFC 2813