From 6c56271e8c2f1a07de8ca7fddeb4f8efb5041b4c Mon Sep 17 00:00:00 2001
From: Matt Johnston <matt@ucc.asn.au>
Date: Tue, 6 Dec 2005 16:51:55 +0000
Subject: [PATCH] 	* fix -L forwarding on the client, broke last rev

--HG--
extra : convert_revision : 826db75f8001f7da7b0b8c91dcf66a44bf107b49
---
 cli-tcpfwd.c |  1 +
 svr-tcpfwd.c |  1 +
 tcp-accept.c | 29 +++++++++++++++++++++--------
 tcpfwd.h     |  2 +-
 4 files changed, 24 insertions(+), 9 deletions(-)

diff --git a/cli-tcpfwd.c b/cli-tcpfwd.c
index d8f1da61..c3bfd4dc 100644
--- a/cli-tcpfwd.c
+++ b/cli-tcpfwd.c
@@ -107,6 +107,7 @@ static int cli_localtcp(unsigned int listenport, const char* remoteaddr,
 	tcpinfo->listenport = listenport;
 
 	tcpinfo->chantype = &cli_chan_tcplocal;
+	tcpinfo->tcp_type = direct;
 
 	ret = listen_tcpfwd(tcpinfo);
 
diff --git a/svr-tcpfwd.c b/svr-tcpfwd.c
index 6e70d676..53a115ed 100644
--- a/svr-tcpfwd.c
+++ b/svr-tcpfwd.c
@@ -208,6 +208,7 @@ static int svr_remotetcpreq() {
 	tcpinfo->listenaddr = bindaddr;
 	tcpinfo->listenport = port;
 	tcpinfo->chantype = &svr_chan_tcpremote;
+	tcpinfo->tcp_type = forwarded;
 
 	ret = listen_tcpfwd(tcpinfo);
 
diff --git a/tcp-accept.c b/tcp-accept.c
index ac335668..90d72b3b 100644
--- a/tcp-accept.c
+++ b/tcp-accept.c
@@ -65,15 +65,28 @@ static void tcp_acceptor(struct Listener *listener, int sock) {
 	}
 
 	if (send_msg_channel_open_init(fd, tcpinfo->chantype) == DROPBEAR_SUCCESS) {
-
-		// address that was connected
-		buf_putstring(ses.writepayload, tcpinfo->listenaddr, 
-				strlen(tcpinfo->listenaddr));
-		// port that was connected
-		buf_putint(ses.writepayload, tcpinfo->listenport);
-		// originator ip
+		unsigned char* addr = NULL;
+		unsigned int port = 0;
+
+		if (tcpinfo->tcp_type == direct) {
+			/* "direct-tcpip" */
+			/* host to connect, port to connect */
+			addr = tcpinfo->sendaddr;
+			port = tcpinfo->sendport;
+		} else {
+			dropbear_assert(tcpinfo->tcp_type == forwarded);
+			/* "forwarded-tcpip" */
+			/* address that was connected, port that was connected */
+			addr = tcpinfo->listenaddr;
+			port = tcpinfo->listenport;
+		}
+
+		buf_putstring(ses.writepayload, addr, strlen(addr));
+		buf_putint(ses.writepayload, port);
+
+		/* originator ip */
 		buf_putstring(ses.writepayload, ipstring, strlen(ipstring));
-		// originator port
+		/* originator port */
 		buf_putint(ses.writepayload, atol(portstring));
 
 		encrypt_packet();
diff --git a/tcpfwd.h b/tcpfwd.h
index e980ee28..28af0298 100644
--- a/tcpfwd.h
+++ b/tcpfwd.h
@@ -40,7 +40,7 @@ struct TCPListener {
 	unsigned int listenport;
 
 	const struct ChanType *chantype;
-
+	enum {direct, forwarded} tcp_type;
 };
 
 /* A link in a list of forwards */
-- 
GitLab