about summary refs log tree commit diff
path: root/src
diff options
context:
space:
mode:
authorAlexander Barton <alex@barton.de>2012-01-06 03:26:24 +0100
committerAlexander Barton <alex@barton.de>2012-01-06 03:26:24 +0100
commit05cc9bf9b064c7048f6b197462a686c5a9100798 (patch)
treea4bcec3819a93507d32fd1691e6cd1b5e762ce79 /src
parentcc06e1ff89ae4b7ffc8d95a8ab1d9b6787a5d142 (diff)
downloadngircd-05cc9bf9b064c7048f6b197462a686c5a9100798.tar.gz
ngircd-05cc9bf9b064c7048f6b197462a686c5a9100798.zip
Conn_Write(): Make sure there is a client when detecting its type
The assert(client != NULL) got triggered during our tests, so there is
an error path that resulted in the connection being still established
(sock >= 0) but the client structure already freed.

So Conn_Write() should handle it!
Diffstat (limited to 'src')
-rw-r--r--src/ngircd/conn.c21
1 files changed, 12 insertions, 9 deletions
diff --git a/src/ngircd/conn.c b/src/ngircd/conn.c
index d9d73e84..5f3c18af 100644
--- a/src/ngircd/conn.c
+++ b/src/ngircd/conn.c
@@ -936,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: