# HG changeset patch # User Matt Johnston # Date 1225628708 0 # Node ID 805e557fdff743e10d88de093867a75e1fad1d38 # Parent 950c38b854a137f6e046f4b188c2b3102830ad64 Report errors if a remote request fails diff -r 950c38b854a1 -r 805e557fdff7 cli-runopts.c --- a/cli-runopts.c Sun Nov 02 12:01:39 2008 +0000 +++ b/cli-runopts.c Sun Nov 02 12:25:08 2008 +0000 @@ -609,6 +609,7 @@ goto badport; } + newfwd->have_reply = 0; newfwd->next = *fwdlist; *fwdlist = newfwd; diff -r 950c38b854a1 -r 805e557fdff7 cli-session.c --- a/cli-session.c Sun Nov 02 12:01:39 2008 +0000 +++ b/cli-session.c Sun Nov 02 12:25:08 2008 +0000 @@ -64,6 +64,10 @@ {SSH_MSG_CHANNEL_OPEN_FAILURE, recv_msg_channel_open_failure}, {SSH_MSG_USERAUTH_BANNER, recv_msg_userauth_banner}, /* client */ {SSH_MSG_USERAUTH_SPECIFIC_60, recv_msg_userauth_specific_60}, /* client */ +#ifdef ENABLE_CLI_REMOTETCPFWD + {SSH_MSG_REQUEST_SUCCESS, cli_recv_msg_request_success}, /* client */ + {SSH_MSG_REQUEST_FAILURE, cli_recv_msg_request_failure}, /* client */ +#endif {0, 0} /* End */ }; diff -r 950c38b854a1 -r 805e557fdff7 cli-tcpfwd.c --- a/cli-tcpfwd.c Sun Nov 02 12:01:39 2008 +0000 +++ b/cli-tcpfwd.c Sun Nov 02 12:25:08 2008 +0000 @@ -128,7 +128,7 @@ CHECKCLEARTOWRITE(); buf_putbyte(ses.writepayload, SSH_MSG_GLOBAL_REQUEST); buf_putstring(ses.writepayload, "tcpip-forward", 13); - buf_putbyte(ses.writepayload, 0); + buf_putbyte(ses.writepayload, 1); /* want_reply */ if (opts.listen_fwd_all) { listenspec = ""; } else { @@ -143,6 +143,42 @@ TRACE(("leave send_msg_global_request_remotetcp")) } +/* The only global success/failure messages are for remotetcp. + * Since there isn't any identifier in these messages, we have to rely on them + * being in the same order as we sent the requests. This is the ordering + * of the cli_opts.remotefwds list */ +void cli_recv_msg_request_success() { + + /* Nothing in the packet. We just mark off that we have received the reply, + * so that we can report failure for later ones. */ + struct TCPFwdList * iter = NULL; + + iter = cli_opts.remotefwds; + while (iter != NULL) { + if (!iter->have_reply) + { + iter->have_reply = 1; + return; + } + iter = iter->next; + } +} + +void cli_recv_msg_request_failure() { + struct TCPFwdList * iter = NULL; + + iter = cli_opts.remotefwds; + while (iter != NULL) { + if (!iter->have_reply) + { + iter->have_reply = 1; + dropbear_log(LOG_WARNING, "Remote TCP forward request failed (port %d -> %s:%d)", iter->listenport, iter->connectaddr, iter->connectport); + return; + } + iter = iter->next; + } +} + void setup_remotetcp() { struct TCPFwdList * iter = NULL; diff -r 950c38b854a1 -r 805e557fdff7 tcpfwd.h --- a/tcpfwd.h Sun Nov 02 12:01:39 2008 +0000 +++ b/tcpfwd.h Sun Nov 02 12:25:08 2008 +0000 @@ -49,6 +49,8 @@ const unsigned char* connectaddr; unsigned int connectport; unsigned int listenport; + unsigned int have_reply; /* is set to 1 after a reply has been received + when setting up the forwarding */ struct TCPFwdList * next; }; @@ -62,6 +64,8 @@ void setup_localtcp(); void setup_remotetcp(); extern const struct ChanType cli_chan_tcpremote; +void cli_recv_msg_request_success(); +void cli_recv_msg_request_failure(); /* Common */ int listen_tcpfwd(struct TCPListener* tcpinfo);