]> git.ipfire.org Git - thirdparty/openssh-portable.git/commitdiff
upstream: Do not ignore SIGINT while waiting for input if editline(3)
authorschwarze@openbsd.org <schwarze@openbsd.org>
Sat, 11 Sep 2021 09:05:50 +0000 (09:05 +0000)
committerDamien Miller <djm@mindrot.org>
Sat, 11 Sep 2021 10:26:51 +0000 (20:26 +1000)
is not used. Instead, in non-interactive mode, exit sftp(1), like for other
serious errors. As pointed out by dtucker@, when compiled without editline(3)
support in portable OpenSSH, the el == NULL branch is also used for
interactive mode. In that case, discard the input line and provide a fresh
prompt to the user just like in the case where editline(3) is used. OK djm@

OpenBSD-Commit-ID: 7d06f4d3ebba62115527fafacf38370d09dfb393

sftp.c

diff --git a/sftp.c b/sftp.c
index 69f84cdcf1a495b444e807c648a3b2948400f7e1..418f312f7bc62ddc770adbbf012a62e7bab73dae 100644 (file)
--- a/sftp.c
+++ b/sftp.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: sftp.c,v 1.211 2021/08/12 09:59:00 schwarze Exp $ */
+/* $OpenBSD: sftp.c,v 1.212 2021/09/11 09:05:50 schwarze Exp $ */
 /*
  * Copyright (c) 2001-2004 Damien Miller <djm@openbsd.org>
  *
@@ -2204,28 +2204,31 @@ interactive_loop(struct sftp_conn *conn, char *file1, char *file2)
        interactive = !batchmode && isatty(STDIN_FILENO);
        err = 0;
        for (;;) {
+               struct sigaction sa;
+
+               interrupted = 0;
+               memset(&sa, 0, sizeof(sa));
+               sa.sa_handler = interactive ? read_interrupt : killchild;
+               if (sigaction(SIGINT, &sa, NULL) == -1) {
+                       debug3("sigaction(%s): %s", strsignal(SIGINT),
+                           strerror(errno));
+                       break;
+               }
                if (el == NULL) {
                        if (interactive)
                                printf("sftp> ");
                        if (fgets(cmd, sizeof(cmd), infile) == NULL) {
                                if (interactive)
                                        printf("\n");
+                               if (interrupted)
+                                       continue;
                                break;
                        }
                } else {
 #ifdef USE_LIBEDIT
                        const char *line;
                        int count = 0;
-                       struct sigaction sa;
-
-                       interrupted = 0;
-                       memset(&sa, 0, sizeof(sa));
-                       sa.sa_handler = read_interrupt;
-                       if (sigaction(SIGINT, &sa, NULL) == -1) {
-                               debug3("sigaction(%s): %s",
-                                   strsignal(SIGINT), strerror(errno));
-                               break;
-                       }
+
                        if ((line = el_gets(el, &count)) == NULL ||
                            count <= 0) {
                                printf("\n");