From 776d9087033b752a3dc82349e5d36cda3451de37 Mon Sep 17 00:00:00 2001
From: Matt Johnston <matt@ucc.asn.au>
Date: Tue, 21 Oct 2014 22:33:49 +0800
Subject: [PATCH] Combine code for SSH_CONNECTION and SSH_CLIENT

---
 chansession.h     |  6 +++---
 svr-chansession.c | 35 +++++++++++++----------------------
 2 files changed, 16 insertions(+), 25 deletions(-)

diff --git a/chansession.h b/chansession.h
index 50ba8f07..4078123c 100644
--- a/chansession.h
+++ b/chansession.h
@@ -51,10 +51,10 @@ struct ChanSess {
 	/* exit details */
 	struct exitinfo exit;
 
-	/* Used to set $SSH_CONNECTION in the child session. 
-	Is only set temporarily before forking */
-	char *connection_string;
 
+	/* These are only set temporarily before forking */
+	/* Used to set $SSH_CONNECTION in the child session.  */
+	char *connection_string;
 	/* Used to set $SSH_CLIENT in the child session. */
 	char *client_string;
 	
diff --git a/svr-chansession.c b/svr-chansession.c
index b3c5c870..67122bb1 100644
--- a/svr-chansession.c
+++ b/svr-chansession.c
@@ -603,34 +603,26 @@ static int sessionpty(struct ChanSess * chansess) {
 	return DROPBEAR_SUCCESS;
 }
 
-static char* make_connection_string() {
+static void make_connection_string(struct ChanSess *chansess) {
 	char *local_ip, *local_port, *remote_ip, *remote_port;
 	size_t len;
-	char *ret;
 	get_socket_address(ses.sock_in, &local_ip, &local_port, &remote_ip, &remote_port, 0);
-	len = strlen(local_ip) + strlen(local_port) + strlen(remote_ip) + strlen(remote_port) + 4;
-	ret = m_malloc(len);
-	snprintf(ret, len, "%s %s %s %s", remote_ip, remote_port, local_ip, local_port);
-	m_free(local_ip);
-	m_free(local_port);
-	m_free(remote_ip);
-	m_free(remote_port);
-	return ret;
-}
 
-static char* make_client_string() {
-	char *local_ip, *local_port, *remote_ip, *remote_port;
-	size_t len;
-	char *ret;
-	get_socket_address(ses.sock_in, &local_ip, &local_port, &remote_ip, &remote_port, 0);
-	len = strlen(local_ip) + strlen(local_port) + strlen(remote_ip) + strlen(remote_port) + 4;
-	ret = m_malloc(len);
-	snprintf(ret, len, "%s %s %s", remote_ip, remote_port, local_port);
+	/* "remoteip remoteport localip localport" */
+	len = strlen(local_ip) + strlen(remote_ip) + 20;
+	chansess->connection_string = m_malloc(len);
+	snprintf(chansess->connection_string, len, "%s %s %s %s", remote_ip, remote_port, local_ip, local_port);
+
+	/* deprecated but bash only loads .bashrc if SSH_CLIENT is set */ 
+	/* "remoteip remoteport localport" */
+	len = strlen(remote_ip) + 20;
+	chansess->client_string = m_malloc(len);
+	snprintf(chansess->client_string, len, "%s %s %s", remote_ip, remote_port, local_port);
+
 	m_free(local_ip);
 	m_free(local_port);
 	m_free(remote_ip);
 	m_free(remote_port);
-	return ret;
 }
 
 /* Handle a command request from the client. This is used for both shell
@@ -693,8 +685,7 @@ static int sessioncommand(struct Channel *channel, struct ChanSess *chansess,
 	/* uClinux will vfork(), so there'll be a race as 
 	connection_string is freed below. */
 #ifndef USE_VFORK
-	chansess->connection_string = make_connection_string();
-	chansess->client_string = make_client_string();
+	make_connection_string(chansess);
 #endif
 
 	if (chansess->term == NULL) {
-- 
GitLab