Package: kbd
Version: 1.15.5-1
Severity: wishlist
Tags: upstream patch

Hello.

In src/showkey.c, when the keyboard mode is not K_XLATE, a warning is
displayed that showkey may fail under X.  I suggest to consider
K_UNICODE as normal as K_XLATE, or even remove this warning since
getfd() will exit() if X is detected.

Later, the code calls signal() for every known signal. This fails with
SIGKILL and SIGSTOP, but this has never been detected because the
return value is not tested.  I suggest to update the signal list from
signal(7), store it in an array for readability, and check errors.
--- showkey.c	2014-10-21 19:42:28.727985666 +0200
+++ showkey.c.new	2014-10-21 19:48:58.385917875 +0200
@@ -42,7 +42,7 @@
 	    m = _("?UNKNOWN?"); break;
 	}
 	printf(_("kb mode was %s\n"), m);
-	if (oldkbmode != K_XLATE) {
+	if ((oldkbmode != K_XLATE) && (oldkbmode != K_UNICODE)) {
 	    printf(_("[ if you are trying this under X, it might not work\n"
 		     "since the X server is also reading /dev/console ]\n"));
 	}
@@ -89,6 +89,48 @@
 	exit(1);
 }
 
+static const int other_signals [] = {
+	// Signals described in the original POSIX.1-1990 standard,
+	// except SIGALRM which is handled separately,
+	// and SIGKILL and SIGSTO which cannot be caught.
+	SIGHUP, SIGINT, SIGQUIT, SIGILL, SIGABRT, SIGFPE, SIGSEGV, SIGPIPE,
+	SIGTERM, SIGUSR1, SIGUSR2, SIGCHLD, SIGCONT, SIGTSTP, SIGTTIN, SIGTTOU,
+	// Signals described in SUSv2 and POSIX.1-2001.
+	SIGBUS, SIGPOLL, SIGPROF, SIGSYS, SIGTRAP,
+	SIGURG, SIGVTALRM, SIGXCPU, SIGXFSZ,
+	// Various other signals.
+	#ifdef SIGIOT
+	SIGIOT,
+	#endif
+	#ifdef SIGEMT
+	SIGEMT,
+	#endif
+	#ifdef SIGSTKFLT
+	SIGSTKFLT,
+	#endif
+	#ifdef SIGIO
+	SIGIO,
+	#endif
+	#ifdef SIGCLD
+	SIGCLD,
+	#endif
+	#ifdef SIGPWR
+	SIGPWR,
+	#endif
+	#ifdef SIGINFO
+	SIGINFO,
+	#endif
+	#ifdef SIGLOST
+	SIGLOST,
+	#endif
+	#ifdef SIGWINCH
+	SIGWINCH,
+	#endif
+	#ifdef SIGUNUSED
+	SIGUNUSED,
+	#endif
+};
+
 int
 main (int argc, char *argv[]) {
 	const char *short_opts = "haskV";
@@ -175,35 +217,16 @@
 	fd = getfd(NULL);
 
 	/* the program terminates when there is no input for 10 secs */
-	signal(SIGALRM, watch_dog);
+	if (signal(SIGALRM, watch_dog) == SIG_ERR)
+		perror("signal (SIGALRM)");
 
 	/*
 	  if we receive a signal, we want to exit nicely, in
 	  order not to leave the keyboard in an unusable mode
 	*/
-	signal(SIGHUP, die);
-	signal(SIGINT, die);
-	signal(SIGQUIT, die);
-	signal(SIGILL, die);
-	signal(SIGTRAP, die);
-	signal(SIGABRT, die);
-	signal(SIGIOT, die);
-	signal(SIGFPE, die);
-	signal(SIGKILL, die);
-	signal(SIGUSR1, die);
-	signal(SIGSEGV, die);
-	signal(SIGUSR2, die);
-	signal(SIGPIPE, die);
-	signal(SIGTERM, die);
-#ifdef SIGSTKFLT
-	signal(SIGSTKFLT, die);
-#endif
-	signal(SIGCHLD, die);
-	signal(SIGCONT, die);
-	signal(SIGSTOP, die);
-	signal(SIGTSTP, die);
-	signal(SIGTTIN, die);
-	signal(SIGTTOU, die);
+	for (i=0; i<sizeof(other_signals)/sizeof(int); i++)
+		if (signal(other_signals[i], on_other_signals) == SIG_ERR)
+			perror ("signal (other signals)");
 
 	get_mode();
 	if (tcgetattr(fd, &old) == -1)

Reply via email to