Client: kill proxy command when exiting application.

This commit is contained in:
Konstantin Tokarev
2015-12-03 16:22:29 +03:00
parent f64a50f319
commit 960364d953
3 changed files with 42 additions and 11 deletions

View File

@@ -41,7 +41,7 @@
static void cli_remoteclosed() ATTRIB_NORETURN;
static void cli_sessionloop();
static void cli_session_init();
static void cli_session_init(pid_t proxy_cmd_pid);
static void cli_finished() ATTRIB_NORETURN;
static void recv_msg_service_accept(void);
static void cli_session_cleanup(void);
@@ -104,7 +104,7 @@ void cli_connected(int result, int sock, void* userdata, const char *errstring)
update_channel_prio();
}
void cli_session(int sock_in, int sock_out, struct dropbear_progress_connection *progress) {
void cli_session(int sock_in, int sock_out, struct dropbear_progress_connection *progress, pid_t proxy_cmd_pid) {
common_session_init(sock_in, sock_out);
@@ -115,8 +115,7 @@ void cli_session(int sock_in, int sock_out, struct dropbear_progress_connection
chaninitialise(cli_chantypes);
/* Set up cli_ses vars */
cli_session_init();
cli_session_init(proxy_cmd_pid);
/* Ready to go */
sessinitdone = 1;
@@ -140,7 +139,7 @@ static void cli_send_kex_first_guess() {
}
#endif
static void cli_session_init() {
static void cli_session_init(pid_t proxy_cmd_pid) {
cli_ses.state = STATE_NOTHING;
cli_ses.kex_state = KEX_NOTHING;
@@ -159,6 +158,8 @@ static void cli_session_init() {
cli_ses.retval = EXIT_SUCCESS; /* Assume it's clean if we don't get a
specific exit status */
cli_ses.proxy_cmd_pid = proxy_cmd_pid;
TRACE(("proxy command PID='%d'", proxy_cmd_pid));
/* Auth */
cli_ses.lastprivkey = NULL;
@@ -334,12 +335,25 @@ static void cli_sessionloop() {
}
void kill_proxy_command(void) {
/*
* Send SIGHUP to proxy command if used. We don't wait() in
* case it hangs and instead rely on init to reap the child
*/
if (cli_ses.proxy_cmd_pid > 1) {
TRACE(("killing proxy command with PID='%d'", cli_ses.proxy_cmd_pid));
kill(cli_ses.proxy_cmd_pid, SIGHUP);
}
}
static void cli_session_cleanup(void) {
if (!sessinitdone) {
return;
}
kill_proxy_command();
/* Set std{in,out,err} back to non-blocking - busybox ash dies nastily if
* we don't revert the flags */
fcntl(cli_ses.stdincopy, F_SETFL, cli_ses.stdinflags);