From cc685c1cbece3cd3ece00a41c41b9781662a01aa Mon Sep 17 00:00:00 2001 From: Damien Miller Date: Wed, 4 Jun 2003 22:51:38 +1000 Subject: [PATCH] - djm@cvs.openbsd.org 2003/06/04 12:41:22 [sftp.c] kill ssh process on receipt of signal; ok markus@ --- ChangeLog | 5 ++++- sftp.c | 28 +++++++++++++++++++--------- 2 files changed, 23 insertions(+), 10 deletions(-) diff --git a/ChangeLog b/ChangeLog index db161a460..c5b3a92b5 100644 --- a/ChangeLog +++ b/ChangeLog @@ -24,6 +24,9 @@ [scp.c] kill ssh process upon receipt of signal, bz #241. based on patch from esb AT hawaii.edu; ok markus@ + - djm@cvs.openbsd.org 2003/06/04 12:41:22 + [sftp.c] + kill ssh process on receipt of signal; ok markus@ - (djm) Update to fix of bug #584: lock card before return. From larsch@trustcenter.de @@ -454,4 +457,4 @@ - Fix sshd BindAddress and -b options for systems using fake-getaddrinfo. Report from murple@murple.net, diagnosis from dtucker@zip.com.au -$Id: ChangeLog,v 1.2779 2003/06/04 12:51:24 djm Exp $ +$Id: ChangeLog,v 1.2780 2003/06/04 12:51:38 djm Exp $ diff --git a/sftp.c b/sftp.c index 9597ca966..fe65b972c 100644 --- a/sftp.c +++ b/sftp.c @@ -24,7 +24,7 @@ #include "includes.h" -RCSID("$OpenBSD: sftp.c,v 1.35 2003/05/15 03:44:00 mouring Exp $"); +RCSID("$OpenBSD: sftp.c,v 1.36 2003/06/04 12:41:22 djm Exp $"); #include "buffer.h" #include "xmalloc.h" @@ -46,11 +46,21 @@ char *__progname; FILE* infile; size_t copy_buffer_len = 32768; size_t num_requests = 16; +static pid_t sshpid = -1; extern int showprogress; static void -connect_to_server(char *path, char **args, int *in, int *out, pid_t *sshpid) +killchild(int signo) +{ + if (sshpid > 1) + kill(sshpid, signo); + + _exit(1); +} + +static void +connect_to_server(char *path, char **args, int *in, int *out) { int c_in, c_out; @@ -72,9 +82,9 @@ connect_to_server(char *path, char **args, int *in, int *out, pid_t *sshpid) c_in = c_out = inout[1]; #endif /* USE_PIPES */ - if ((*sshpid = fork()) == -1) + if ((sshpid = fork()) == -1) fatal("fork: %s", strerror(errno)); - else if (*sshpid == 0) { + else if (sshpid == 0) { if ((dup2(c_in, STDIN_FILENO) == -1) || (dup2(c_out, STDOUT_FILENO) == -1)) { fprintf(stderr, "dup2: %s\n", strerror(errno)); @@ -89,6 +99,9 @@ connect_to_server(char *path, char **args, int *in, int *out, pid_t *sshpid) exit(1); } + signal(SIGTERM, killchild); + signal(SIGINT, killchild); + signal(SIGHUP, killchild); close(c_in); close(c_out); } @@ -109,7 +122,6 @@ int main(int argc, char **argv) { int in, out, ch, err; - pid_t sshpid; char *host, *userhost, *cp, *file2; int debug_level = 0, sshver = 2; char *file1 = NULL, *sftp_server = NULL; @@ -227,15 +239,13 @@ main(int argc, char **argv) args.list[0] = ssh_program; fprintf(stderr, "Connecting to %s...\n", host); - connect_to_server(ssh_program, args.list, &in, &out, - &sshpid); + connect_to_server(ssh_program, args.list, &in, &out); } else { args.list = NULL; addargs(&args, "sftp-server"); fprintf(stderr, "Attaching to %s...\n", sftp_direct); - connect_to_server(sftp_direct, args.list, &in, &out, - &sshpid); + connect_to_server(sftp_direct, args.list, &in, &out); } err = interactive_loop(in, out, file1, file2);