diff options
| author | Alexander Barton <alex@barton.de> | 2012-01-06 03:26:24 +0100 |
|---|---|---|
| committer | Alexander Barton <alex@barton.de> | 2012-01-06 03:26:24 +0100 |
| commit | 05cc9bf9b064c7048f6b197462a686c5a9100798 (patch) | |
| tree | a4bcec3819a93507d32fd1691e6cd1b5e762ce79 /src | |
| parent | cc06e1ff89ae4b7ffc8d95a8ab1d9b6787a5d142 (diff) | |
| download | ngircd-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.c | 21 |
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: |