]> git.ipfire.org Git - thirdparty/openssh-portable.git/commitdiff
upstream commit
authordjm@openbsd.org <djm@openbsd.org>
Fri, 1 May 2015 04:03:20 +0000 (04:03 +0000)
committerDamien Miller <djm@mindrot.org>
Sun, 10 May 2015 01:54:25 +0000 (11:54 +1000)
remove failed remote forwards established by muliplexing
 from the list of active forwards; bz#2363, patch mostly by Yoann Ricordel; ok
 dtucker@

mux.c

diff --git a/mux.c b/mux.c
index e8d753d00988348f0a01ec3dfbb78d3e4377078e..cdc01bd4fff5f3a19798f0b89b5abd4c49a28e93 100644 (file)
--- a/mux.c
+++ b/mux.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: mux.c,v 1.52 2015/05/01 04:01:58 djm Exp $ */
+/* $OpenBSD: mux.c,v 1.53 2015/05/01 04:03:20 djm Exp $ */
 /*
  * Copyright (c) 2002-2008 Damien Miller <djm@openbsd.org>
  *
@@ -593,7 +593,9 @@ mux_confirm_remote_forward(int type, u_int32_t seq, void *ctxt)
                return;
        }
        buffer_init(&out);
-       if (fctx->fid >= options.num_remote_forwards) {
+       if (fctx->fid >= options.num_remote_forwards ||
+           (options.remote_forwards[fctx->fid].connect_path == NULL &&
+           options.remote_forwards[fctx->fid].connect_host == NULL)) {
                xasprintf(&failmsg, "unknown forwarding id %d", fctx->fid);
                goto fail;
        }
@@ -627,6 +629,17 @@ mux_confirm_remote_forward(int type, u_int32_t seq, void *ctxt)
                else
                        xasprintf(&failmsg, "remote port forwarding failed for "
                            "listen port %d", rfwd->listen_port);
+
+                debug2("%s: clearing registered forwarding for listen %d, "
+                   "connect %s:%d", __func__, rfwd->listen_port,
+                   rfwd->connect_path ? rfwd->connect_path :
+                   rfwd->connect_host, rfwd->connect_port);
+
+               free(rfwd->listen_host);
+               free(rfwd->listen_path);
+               free(rfwd->connect_host);
+               free(rfwd->connect_path);
+               memset(rfwd, 0, sizeof(*rfwd));
        }
  fail:
        error("%s: %s", __func__, failmsg);