Commit Diff


commit - 628c6c962b1054de4c27304f53c4ac7c50c79a11
commit + 025342fe46ae504a08be8c642901ec7eb7c4fccb
blob - cd350a8d619700a2ca89034b5a05b132df6cba36
blob + ab975b31c7d97810e0fec421bee7e2259282a9c3
--- src/ngircd/conn.c
+++ 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 */
 
 
blob - 82ba67c28a945c59a0c136afc4b9cf11af2e482d
blob + b951badb5b26ba5687ed00bb56c1b0e67694551d
--- src/ngircd/ngircd.c
+++ 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( );