diff options
author | schwarze@openbsd.org <schwarze@openbsd.org> | 2021-09-11 11:05:50 +0200 |
---|---|---|
committer | Damien Miller <djm@mindrot.org> | 2021-09-11 12:26:51 +0200 |
commit | 19b3d846f06697c85957ab79a63454f57f8e22d6 (patch) | |
tree | 0b55968e2ce7644ad04c843a8c50d3e3abdd27e2 /sftp.c | |
parent | upstream: when using SFTP protocol, continue transferring files after a (diff) | |
download | openssh-19b3d846f06697c85957ab79a63454f57f8e22d6.tar.xz openssh-19b3d846f06697c85957ab79a63454f57f8e22d6.zip |
upstream: Do not ignore SIGINT while waiting for input if editline(3)
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
Diffstat (limited to 'sftp.c')
-rw-r--r-- | sftp.c | 25 |
1 files changed, 14 insertions, 11 deletions
@@ -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"); |