Hello,

When lock(1) receives SIGINT, SIGQUIT, or SIGTSTP, it calls hi()
twice, once because it's the signal handler, and once after
readpassphrase() errors because the read was interrupted.

Since hi() gets called when readpassphrase() fails anyway, this
patch ignores the signals instead of using hi() as a handler.

=== behavior before ===

$ lock
Key: [foo\n]
Again: [foo\n]
lock: /dev/ttyp0 on netboot.realconnect.net. timeout in 15 minutes
time now is Wed Mar 12 15:46:49 2014
Key: [asdf\n]
Key: [\n]
lock: type in the unlock key. timeout in 14:53 minutes
Key: [^C]
lock: type in the unlock key. timeout in 14:52 minutes
lock: type in the unlock key. timeout in 14:52 minutes
Key: [foo\n]

=== behavior after ===

$ obj/lock
Key: [foo\n]
Again: [foo\n]
lock: /dev/ttyp0 on netboot.realconnect.net. timeout in 15 minutes
time now is Wed Mar 12 15:47:03 2014
Key: [asdf\n]
Key: [\n]
lock: type in the unlock key. timeout in 14:54 minutes
Key: [^C]
lock: type in the unlock key. timeout in 14:53 minutes
Key: [foo\n]


Index: lock.c
===================================================================
RCS file: /cvs/src/usr.bin/lock/lock.c,v
retrieving revision 1.27
diff -u -p -r1.27 lock.c
--- lock.c      22 Aug 2013 04:43:40 -0000      1.27
+++ lock.c      12 Mar 2014 19:59:48 -0000
@@ -62,7 +62,7 @@
 #define        TIMEOUT 15
 
 void bye(int);
-void hi(int);
+void hi(void);
 
 struct timeval timeout;
 struct timeval zerotime;
@@ -162,9 +162,9 @@ main(int argc, char *argv[])
        }
 
        /* set signal handlers */
-       (void)signal(SIGINT, hi);
-       (void)signal(SIGQUIT, hi);
-       (void)signal(SIGTSTP, hi);
+       (void)signal(SIGINT, SIG_IGN);
+       (void)signal(SIGQUIT, SIG_IGN);
+       (void)signal(SIGTSTP, SIG_IGN);
        (void)signal(SIGALRM, bye);
 
        ntimer.it_interval = zerotime;
@@ -186,7 +186,7 @@ main(int argc, char *argv[])
        for (cnt = 0;;) {
                if (!readpassphrase("Key: ", s, sizeof(s), RPP_ECHO_OFF) ||
                    *s == '\0') {
-                       hi(0);
+                       hi();
                        continue;
                }
                if (usemine) {
@@ -219,9 +219,8 @@ main(int argc, char *argv[])
        exit(0);
 }
 
-/*ARGSUSED*/
 void
-hi(int signo)
+hi(void)
 {
        char buf[1024], buf2[1024];
        time_t left;

Reply via email to