X-Git-Url: https://arthur.barton.de/cgi-bin/gitweb.cgi?p=ngircd-alex.git;a=blobdiff_plain;f=src%2Fngircd%2Fconn.c;h=e8bfcf1c70cbbb9e848061eff7b151a2a7c8f854;hp=9c6baef2676dd35aab47eaca13b8bf3ef39946f5;hb=ae00c100acdb4d2d3f99524d30258d07eefcfb6d;hpb=69ce65bacb0155be5fb9159a3dfc5c8e3390cc0d diff --git a/src/ngircd/conn.c b/src/ngircd/conn.c index 9c6baef2..e8bfcf1c 100644 --- a/src/ngircd/conn.c +++ b/src/ngircd/conn.c @@ -128,7 +128,7 @@ time_t idle_t = 0; * Get number of sockets available from systemd(8). * * ngIRCd needs to implement its own sd_listen_fds(3) function and can't - * use the one provided by systemd itself, becaus the sockets will be + * use the one provided by systemd itself, because the sockets will be * used in a forked child process with a new PID, and this would trigger * an error in the standard implementation. * @@ -152,7 +152,9 @@ my_sd_listen_fds(void) if (!e || !*e) return -1; count = atoi(e); +#ifdef HAVE_UNSETENV unsetenv("LISTEN_FDS"); +#endif return count; } @@ -222,7 +224,7 @@ cb_connserver(int sock, UNUSED short what) if (server < 0) { Log(LOG_ERR, "Connection on socket %d to \"%s\" aborted!", sock, My_Connections[idx].host); - Conn_Close(idx, "Connection aborted!", NULL, false); + Conn_Close(idx, "Connection aborted", NULL, false); return; } @@ -402,14 +404,13 @@ cb_clientserver_ssl(int sock, UNUSED short what) /** - * Initialize connecion module. + * Initialize connection module. */ GLOBAL void Conn_Init( void ) { CONN_ID i; - /* Speicher fuer Verbindungs-Pool anfordern */ Pool_Size = CONNECTION_POOL; if ((Conf_MaxConnections > 0) && (Pool_Size > Conf_MaxConnections)) @@ -923,7 +924,7 @@ Conn_Handler(void) * which is the granularity with witch we handle "penalty * times" for example. * Note: tv_sec/usec are undefined(!) after io_dispatch() - * returns, so we have to set it beforce each call to it! */ + * returns, so we have to set it before each call to it! */ tv.tv_usec = 0; tv.tv_sec = 1; @@ -1008,7 +1009,7 @@ va_dcl * * So we have a big problem here: we should send more bytes * to the network than we are allowed to and we don't know - * the originator (any more). The "old" behaviour of blaming + * the originator (any more). The "old" behavior of blaming * the receiver ("next hop") is a bad idea (it could be just * an other server only routing the message!), so the only * option left is to shorten the string and to hope that the @@ -1182,8 +1183,8 @@ Conn_Close( CONN_ID Idx, const char *LogMsg, const char *FwdMsg, bool InformClie /* Is this link already shutting down? */ if( Conn_OPTION_ISSET( &My_Connections[Idx], CONN_ISCLOSING )) { /* Conn_Close() has been called recursively for this link; - * probabe reason: Handle_Write() failed -- see below. */ - LogDebug("Recursive request to close connection: %d", Idx ); + * probable reason: Handle_Write() failed -- see below. */ + LogDebug("Recursive request to close connection %d!", Idx ); return; } @@ -1229,7 +1230,7 @@ Conn_Close( CONN_ID Idx, const char *LogMsg, const char *FwdMsg, bool InformClie c = Conn_GetClient( Idx ); #ifdef SSL_SUPPORT if ( Conn_OPTION_ISSET( &My_Connections[Idx], CONN_SSL )) { - Log(LOG_INFO, "SSL connection %d shutting down ...", Idx); + LogDebug("SSL connection %d shutting down ...", Idx); ConnSSL_Free(&My_Connections[Idx]); } #endif @@ -1451,9 +1452,14 @@ Handle_Write( CONN_ID Idx ) if (errno == EAGAIN || errno == EINTR) return true; - Log(LOG_ERR, "Write error on connection %d (socket %d): %s!", - Idx, My_Connections[Idx].sock, strerror(errno)); - Conn_Close(Idx, "Write error!", NULL, false); + if (!Conn_OPTION_ISSET(&My_Connections[Idx], CONN_ISCLOSING)) + Log(LOG_ERR, + "Write error on connection %d (socket %d): %s!", + Idx, My_Connections[Idx].sock, strerror(errno)); + else + LogDebug("Recursive write error on connection %d (socket %d): %s!", + Idx, My_Connections[Idx].sock, strerror(errno)); + Conn_Close(Idx, "Write error", NULL, false); return false; } @@ -1664,7 +1670,11 @@ Conn_StartLogin(CONN_ID Idx) #endif (void)Conn_WriteStr(Idx, "NOTICE AUTH :*** Looking up your hostname"); - (void)Handle_Write(Idx); + /* Send buffered data to the client, but break on errors + * because Handle_Write() would have closed the connection + * again in this case! */ + if (!Handle_Write(Idx)) + return; } Resolve_Addr(&My_Connections[Idx].proc_stat, &My_Connections[Idx].addr, @@ -1709,7 +1719,7 @@ Socket2Index( int Sock ) /** - * Read data from the network to the read buffer. If an error occures, + * Read data from the network to the read buffer. If an error occurs, * the socket of this connection will be shut down. * * @param Idx Connection index. @@ -1858,7 +1868,7 @@ Handle_Buffer(CONN_ID Idx) maxcmd = (int)(Client_UserCount() / 5) + MAX_COMMANDS_SERVER_MIN; /* Allow servers to handle even more commands while peering - * to speed up server login and network synchronisation. */ + * to speed up server login and network synchronization. */ if (Conn_LastPing(Idx) == 0) maxcmd *= 5; break; @@ -2123,6 +2133,7 @@ New_Server( int Server , ng_ipaddr_t *dest) if (!ng_ipaddr_tostr_r(dest, ip_str)) { Log(LOG_WARNING, "New_Server: Could not convert IP to string"); + Conf_Server[Server].conn_id = NONE; return; } @@ -2137,11 +2148,14 @@ New_Server( int Server , ng_ipaddr_t *dest) if (new_sock < 0) { Log(LOG_CRIT, "Can't create socket (af %d): %s!", af_dest, strerror(errno)); + Conf_Server[Server].conn_id = NONE; return; } - if (!Init_Socket(new_sock)) + if (!Init_Socket(new_sock)) { + Conf_Server[Server].conn_id = NONE; return; + } /* is a bind address configured? */ res = ng_ipaddr_af(&Conf_Server[Server].bind_addr); @@ -2157,6 +2171,7 @@ New_Server( int Server , ng_ipaddr_t *dest) if(( res != 0 ) && ( errno != EINPROGRESS )) { Log( LOG_CRIT, "Can't connect socket: %s!", strerror( errno )); close( new_sock ); + Conf_Server[Server].conn_id = NONE; return; } @@ -2165,12 +2180,14 @@ New_Server( int Server , ng_ipaddr_t *dest) "Cannot allocate memory for server connection (socket %d)", new_sock); close( new_sock ); + Conf_Server[Server].conn_id = NONE; return; } if (!io_event_create( new_sock, IO_WANTWRITE, cb_connserver)) { Log(LOG_ALERT, "io_event_create(): could not add fd %d", strerror(errno)); close(new_sock); + Conf_Server[Server].conn_id = NONE; return; } @@ -2185,6 +2202,7 @@ New_Server( int Server , ng_ipaddr_t *dest) if (!c) { Log( LOG_ALERT, "Can't establish connection: can't create client structure!" ); io_close(new_sock); + Conf_Server[Server].conn_id = NONE; return; } @@ -2352,7 +2370,7 @@ cb_Connect_to_Server(int fd, UNUSED short events) /** * Read results of a resolver sub-process from the pipe and update the - * apropriate connection/client structure(s): hostname and/or IDENT user name. + * appropriate connection/client structure(s): hostname and/or IDENT user name. * * @param r_fd File descriptor of the pipe to the sub-process. * @param events (ignored IO specification) @@ -2446,21 +2464,27 @@ cb_Read_Resolver_Result( int r_fd, UNUSED short events ) *ptr ? "" : ": ", *ptr ? "" : identptr); } - } else { + } else if(Conf_Ident) { Log(LOG_INFO, "IDENT lookup for connection %d: no result.", i); - if (Conf_NoticeAuth && Conf_Ident) + if (Conf_NoticeAuth) (void)Conn_WriteStr(i, "NOTICE AUTH :*** No ident response"); } #endif - if (Conf_NoticeAuth) - (void)Handle_Write(i); + if (Conf_NoticeAuth) { + /* Send buffered data to the client, but break on + * errors because Handle_Write() would have closed + * the connection again in this case! */ + if (!Handle_Write(i)) + return; + } Class_HandleServerBans(c); } #ifdef DEBUG - else Log( LOG_DEBUG, "Resolver: discarding result for already registered connection %d.", i ); + else + LogDebug("Resolver: discarding result for already registered connection %d.", i); #endif } /* cb_Read_Resolver_Result */ @@ -2579,7 +2603,7 @@ Conn_SetAuthPing(CONN_ID Idx, long ID) #ifdef SSL_SUPPORT /** - * Get information about used SSL chiper. + * Get information about used SSL cipher. * * @param Idx Connection index number. * @param buf Buffer for returned information text. @@ -2613,22 +2637,22 @@ Conn_UsesSSL(CONN_ID Idx) GLOBAL char * -Conn_GetFingerprint(CONN_ID Idx) +Conn_GetCertFp(CONN_ID Idx) { if (Idx < 0) return NULL; assert(Idx < (int) array_length(&My_ConnArray, sizeof(CONNECTION))); - return ConnSSL_GetFingerprint(&My_Connections[Idx]); + return ConnSSL_GetCertFp(&My_Connections[Idx]); } GLOBAL bool -Conn_SetFingerprint(CONN_ID Idx, const char *fingerprint) +Conn_SetCertFp(CONN_ID Idx, const char *fingerprint) { if (Idx < 0) return false; assert(Idx < (int) array_length(&My_ConnArray, sizeof(CONNECTION))); - return ConnSSL_SetFingerprint(&My_Connections[Idx], fingerprint); + return ConnSSL_SetCertFp(&My_Connections[Idx], fingerprint); } #else GLOBAL bool @@ -2639,14 +2663,14 @@ Conn_UsesSSL(UNUSED CONN_ID Idx) GLOBAL char * -Conn_GetFingerprint(UNUSED CONN_ID Idx) +Conn_GetCertFp(UNUSED CONN_ID Idx) { return NULL; } GLOBAL bool -Conn_SetFingerprint(UNUSED CONN_ID Idx, UNUSED const char *fingerprint) +Conn_SetCertFp(UNUSED CONN_ID Idx, UNUSED const char *fingerprint) { return true; }