[pacman-dev] [PATCH 06/11] avoid unsafe functions in signal handler

Andrew Gregory andrew.gregory.8 at gmail.com
Fri Dec 4 20:31:37 UTC 2015


signal(7) lists a set of functions that can safely be called from within
a signal handler.  Even fileno and strlen are not guaranteed to be safe.

Signed-off-by: Andrew Gregory <andrew.gregory.8 at gmail.com>
---
 src/pacman/pacman.c | 16 +++++++---------
 1 file changed, 7 insertions(+), 9 deletions(-)

diff --git a/src/pacman/pacman.c b/src/pacman/pacman.c
index 05b8cd3..ba86dec 100644
--- a/src/pacman/pacman.c
+++ b/src/pacman/pacman.c
@@ -311,21 +311,19 @@ static ssize_t xwrite(int fd, const void *buf, size_t count)
  */
 static void handler(int signum)
 {
-	int out = fileno(stdout);
-	int err = fileno(stderr);
-	const char *msg;
 	if(signum == SIGSEGV) {
-		msg = "\nerror: segmentation fault\n"
+		const char msg[] = "\nerror: segmentation fault\n"
 			"Please submit a full bug report with --debug if appropriate.\n";
-		xwrite(err, msg, strlen(msg));
+		xwrite(STDERR_FILENO, msg, ARRAYSIZE(msg) - 1);
 		exit(signum);
 	} else if(signum == SIGINT || signum == SIGHUP) {
 		if(signum == SIGINT) {
-			msg = "\nInterrupt signal received\n";
+			const char msg[] = "\nInterrupt signal received\n";
+			xwrite(STDERR_FILENO, msg, ARRAYSIZE(msg) - 1);
 		} else {
-			msg = "\nHangup signal received\n";
+			const char msg[] = "\nHangup signal received\n";
+			xwrite(STDERR_FILENO, msg, ARRAYSIZE(msg) - 1);
 		}
-		xwrite(err, msg, strlen(msg));
 		if(alpm_trans_interrupt(config->handle) == 0) {
 			/* a transaction is being interrupted, don't exit pacman yet. */
 			return;
@@ -337,7 +335,7 @@ static void handler(int signum)
 	/* SIGINT/SIGHUP: no committing transaction, release it now and then exit pacman */
 	alpm_unlock(config->handle);
 	/* output a newline to be sure we clear any line we may be on */
-	xwrite(out, "\n", 1);
+	xwrite(STDOUT_FILENO, "\n", 1);
 	_Exit(128 + signum);
 }
 
-- 
2.6.3


More information about the pacman-dev mailing list