diff --git a/src/ngircd/conn.c b/src/ngircd/conn.c index cd350a8d..ab975b31 100644 --- a/src/ngircd/conn.c +++ b/src/ngircd/conn.c @@ -2025,20 +2025,32 @@ cb_Read_Resolver_Result( int r_fd, UNUSED short events ) } /* cb_Read_Resolver_Result */ +/** + * Write a "simple" (error) message to a socket. + * The message is sent without using the connection write buffers, without + * compression/encryption, and even without any error reporting. It is + * designed for error messages of e.g. New_Connection(). */ static void -Simple_Message( int Sock, const char *Msg ) +Simple_Message(int Sock, const char *Msg) { char buf[COMMAND_LEN]; size_t len; - /* Write "simple" message to socket, without using compression - * or even the connection write buffers. Used e.g. for error - * messages by New_Connection(). */ - assert( Sock > NONE ); - assert( Msg != NULL ); - strlcpy( buf, Msg, sizeof buf - 2); - len = strlcat( buf, "\r\n", sizeof buf); - (void)write(Sock, buf, len); + assert(Sock > NONE); + assert(Msg != NULL); + + strlcpy(buf, Msg, sizeof buf - 2); + len = strlcat(buf, "\r\n", sizeof buf); + if (write(Sock, buf, len) < 0) { + /* Because this function most probably got called to log + * an error message, any write error is ignored here to + * avoid an endless loop. But casting the result of write() + * to "void" doesn't satisfy the GNU C code attribute + * "warn_unused_result" which is used by some versions of + * glibc (e.g. 2.11.1), therefore this silly error + * "handling" code here :-( */ + return; + } } /* Simple_Error */ diff --git a/src/ngircd/ngircd.c b/src/ngircd/ngircd.c index 82ba67c2..b951badb 100644 --- a/src/ngircd/ngircd.c +++ b/src/ngircd/ngircd.c @@ -798,7 +798,9 @@ NGIRCd_Init( bool NGIRCd_NoDaemon ) #else setpgrp(0, getpid()); #endif - chdir( "/" ); + if (chdir( "/" ) != 0) + Log(LOG_ERR, "Can't change directory to '/': %s", + strerror(errno)); /* Detach stdin, stdout and stderr */ Setup_FDStreams( );