]> arthur.barton.de Git - ngircd-alex.git/blobdiff - src/ngircd/conn.c
Conn_Write(): Make sure there is a client when detecting its type
[ngircd-alex.git] / src / ngircd / conn.c
index aa754eb482ae5c38f224adee20c9ac129751f19e..5f3c18afd0108fe8eb115c236257cc3c2879bcd7 100644 (file)
@@ -65,6 +65,7 @@
 #include "ngircd.h"
 #include "array.h"
 #include "client.h"
+#include "class.h"
 #include "conf.h"
 #include "conn-ssl.h"
 #include "conn-zip.h"
@@ -369,7 +370,7 @@ cb_clientserver_ssl(int sock, short what)
 
 
 /**
- * Initialite connecion module.
+ * Initialize connecion module.
  */
 GLOBAL void
 Conn_Init( void )
@@ -742,6 +743,9 @@ Conn_Handler(void)
                Check_Servers();
                Check_Connections();
 
+               /* Expire outdated class/list items */
+               Class_Expire();
+
                /* Look for non-empty read buffers ... */
                for (i = 0; i < Pool_Size; i++) {
                        if ((My_Connections[i].sock > NONE)
@@ -932,22 +936,25 @@ Conn_Write( CONN_ID Idx, char *Data, size_t Len )
        assert( Data != NULL );
        assert( Len > 0 );
 
-       c = Conn_GetClient(Idx);
-       assert( c != NULL);
-
-       /* Servers do get special write buffer limits, so they can generate
-        * all the messages that are required while peering. */
-       if (Client_Type(c) == CLIENT_SERVER)
-               writebuf_limit = WRITEBUFFER_SLINK_LEN;
-
        /* Is the socket still open? A previous call to Conn_Write()
         * may have closed the connection due to a fatal error.
         * In this case it is sufficient to return an error, as well. */
-       if( My_Connections[Idx].sock <= NONE ) {
+       if (My_Connections[Idx].sock <= NONE) {
                LogDebug("Skipped write on closed socket (connection %d).", Idx);
                return false;
        }
 
+       /* 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 write buffer limits, so they can
+                * generate all the messages that are required while peering. */
+               if (Client_Type(c) == CLIENT_SERVER)
+                       writebuf_limit = WRITEBUFFER_SLINK_LEN;
+       } else
+               LogDebug("Write on socket without client (connection %d)!?", Idx);
+
 #ifdef ZLIB
        if ( Conn_OPTION_ISSET( &My_Connections[Idx], CONN_ZIP )) {
                /* Compressed link:
@@ -1010,7 +1017,7 @@ Conn_Write( CONN_ID Idx, char *Data, size_t Len )
 GLOBAL void
 Conn_Close( CONN_ID Idx, const char *LogMsg, const char *FwdMsg, bool InformClient )
 {
-       /* Close connection. Open pipes of asyncronous resolver
+       /* Close connection. Open pipes of asynchronous resolver
         * sub-processes are closed down. */
 
        CLIENT *c;
@@ -1568,7 +1575,7 @@ Read_Request( CONN_ID Idx )
                if (!array_catb(&My_Connections[Idx].zip.rbuf, readbuf,
                                (size_t) len)) {
                        Log(LOG_ERR,
-                           "Could not append recieved data to zip input buffer (connn %d): %d bytes!",
+                           "Could not append recieved data to zip input buffer (connection %d): %d bytes!",
                            Idx, len);
                        Conn_Close(Idx, "Receive buffer space exhausted", NULL,
                                   false);
@@ -1578,7 +1585,9 @@ Read_Request( CONN_ID Idx )
 #endif
        {
                if (!array_catb( &My_Connections[Idx].rbuf, readbuf, len)) {
-                       Log( LOG_ERR, "Could not append recieved data to input buffer (connn %d): %d bytes!", Idx, len );
+                       Log(LOG_ERR,
+                           "Could not append recieved data to input buffer (connection %d): %d bytes!",
+                           Idx, len);
                        Conn_Close(Idx, "Receive buffer space exhausted", NULL, false );
                }
        }