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)