Bugzilla – Attachment 2455 Details for
Bug 2255
tunneling with -W does not report non 0 exit codes on failure even with ExitOnForwardFailure=yes
Home
|
New
|
Browse
|
Search
|
[?]
|
Reports
|
Requests
|
Help
|
New Account
|
Log In
[x]
|
Forgot Password
Login:
[x]
[patch]
delay reply to multiplexied stdio forwards until confirmation has been received
mux-stdio-report.diff (text/plain), 3.87 KB, created by
Damien Miller
on 2014-07-16 15:18:50 AEST
(
hide
)
Description:
delay reply to multiplexied stdio forwards until confirmation has been received
Filename:
MIME Type:
Creator:
Damien Miller
Created:
2014-07-16 15:18:50 AEST
Size:
3.87 KB
patch
obsolete
>diff --git mux.c mux.c >index 7df32df..b8d9790 100644 >--- mux.c >+++ mux.c >@@ -92,6 +92,11 @@ struct mux_session_confirm_ctx { > u_int rid; > }; > >+/* Context for stdio fwd open confirmation callback */ >+struct mux_stdio_confirm_ctx { >+ u_int rid; >+}; >+ > /* Context for global channel callback */ > struct mux_channel_confirm_ctx { > u_int cid; /* channel id */ >@@ -144,6 +149,7 @@ struct mux_master_state { > #define MUX_FWD_DYNAMIC 3 > > static void mux_session_confirm(int, int, void *); >+static void mux_stdio_confirm(int, int, void *); > > static int process_mux_master_hello(u_int, Channel *, Buffer *, Buffer *); > static int process_mux_new_session(u_int, Channel *, Buffer *, Buffer *); >@@ -870,6 +876,7 @@ process_mux_stdio_fwd(u_int rid, Channel *c, Buffer *m, Buffer *r) > char *reserved, *chost; > u_int cport, i, j; > int new_fd[2]; >+ struct mux_stdio_confirm_ctx *cctx; > > chost = reserved = NULL; > if ((reserved = buffer_get_string_ret(m, NULL)) == NULL || >@@ -949,15 +956,60 @@ process_mux_stdio_fwd(u_int rid, Channel *c, Buffer *m, Buffer *r) > > channel_register_cleanup(nc->self, mux_master_session_cleanup_cb, 1); > >- /* prepare reply */ >- /* XXX defer until channel confirmed */ >- buffer_put_int(r, MUX_S_SESSION_OPENED); >- buffer_put_int(r, rid); >- buffer_put_int(r, nc->self); >+ cctx = xcalloc(1, sizeof(*cctx)); >+ cctx->rid = rid; >+ channel_register_open_confirm(nc->self, mux_stdio_confirm, cctx); >+ c->mux_pause = 1; /* stop handling messages until open_confirm done */ > >+ /* reply is deferred, sent by mux_session_confirm */ > return 0; > } > >+/* Callback on open confirmation in mux master for a mux stdio fwd session. */ >+static void >+mux_stdio_confirm(int id, int success, void *arg) >+{ >+ struct mux_stdio_confirm_ctx *cctx = arg; >+ Channel *c, *cc; >+ Buffer reply; >+ >+ if (cctx == NULL) >+ fatal("%s: cctx == NULL", __func__); >+ if ((c = channel_by_id(id)) == NULL) >+ fatal("%s: no channel for id %d", __func__, id); >+ if ((cc = channel_by_id(c->ctl_chan)) == NULL) >+ fatal("%s: channel %d lacks control channel %d", __func__, >+ id, c->ctl_chan); >+ >+ if (!success) { >+ debug3("%s: sending failure reply", __func__); >+ /* prepare reply */ >+ buffer_init(&reply); >+ buffer_put_int(&reply, MUX_S_FAILURE); >+ buffer_put_int(&reply, cctx->rid); >+ buffer_put_cstring(&reply, "Session open refused by peer"); >+ goto done; >+ } >+ >+ debug3("%s: sending success reply", __func__); >+ /* prepare reply */ >+ buffer_init(&reply); >+ buffer_put_int(&reply, MUX_S_SESSION_OPENED); >+ buffer_put_int(&reply, cctx->rid); >+ buffer_put_int(&reply, c->self); >+ >+ done: >+ /* Send reply */ >+ buffer_put_string(&cc->output, buffer_ptr(&reply), buffer_len(&reply)); >+ buffer_free(&reply); >+ >+ if (cc->mux_pause <= 0) >+ fatal("%s: mux_pause %d", __func__, cc->mux_pause); >+ cc->mux_pause = 0; /* start processing messages again */ >+ c->open_confirm_ctx = NULL; >+ free(cctx); >+} >+ > static int > process_mux_stop_listening(u_int rid, Channel *c, Buffer *m, Buffer *r) > { >@@ -1902,7 +1954,7 @@ mux_client_request_stdio_fwd(int fd) > case MUX_S_FAILURE: > e = buffer_get_string(&m, NULL); > buffer_free(&m); >- fatal("%s: stdio forwarding request failed: %s", __func__, e); >+ fatal("Stdio forwarding request failed: %s", e); > default: > buffer_free(&m); > error("%s: unexpected response from master 0x%08x", >diff --git ssh.c ssh.c >index 950d623..8439fb3 100644 >--- ssh.c >+++ ssh.c >@@ -1300,6 +1300,13 @@ client_cleanup_stdio_fwd(int id, void *arg) > } > > static void >+ssh_stdio_confirm(int id, int success, void *arg) >+{ >+ if (!success) >+ fatal("stdio forwarding failed"); >+} >+ >+static void > ssh_init_stdio_forwarding(void) > { > Channel *c; >@@ -1319,6 +1326,7 @@ ssh_init_stdio_forwarding(void) > stdio_forward_port, in, out)) == NULL) > fatal("%s: channel_connect_stdio_fwd failed", __func__); > channel_register_cleanup(c->self, client_cleanup_stdio_fwd, 0); >+ channel_register_open_confirm(c->self, ssh_stdio_confirm, NULL); > } > > static void
You cannot view the attachment while viewing its details because your browser does not support IFRAMEs.
View the attachment on a separate page
.
View Attachment As Diff
View Attachment As Raw
Flags:
dtucker
:
ok+
Actions:
View
|
Diff
Attachments on
bug 2255
: 2455