From 88d0c30c06859169023482d502f7bbbcffdbe4a1 Mon Sep 17 00:00:00 2001
From: deuce <>
Date: Sat, 21 Jun 2014 03:42:55 +0000
Subject: [PATCH] Add a patch to allow setting the terminal type and size. The
 access paramter to the ACL is bogus, but it works.

---
 3rdp/build/GNUmakefile           |   5 +
 3rdp/build/terminal-params.patch | 181 +++++++++++++++++++++++++++++++
 2 files changed, 186 insertions(+)
 create mode 100644 3rdp/build/terminal-params.patch

diff --git a/3rdp/build/GNUmakefile b/3rdp/build/GNUmakefile
index 3be8cb4ad4..f0176b6bf0 100644
--- a/3rdp/build/GNUmakefile
+++ b/3rdp/build/GNUmakefile
@@ -27,6 +27,10 @@ ifeq ($(shell perl -e 'print "$(machine)"=~/\.arm/?"YES":"NO"'),YES)
  endif
 endif
 
+.PHONY: cryptlib libmozjs
+cryptlib: $(CRYPTLIB_BUILD)
+libmozjs: $(JSLIB_BUILD)
+
 ###############
 # Directories #
 ###############
@@ -68,6 +72,7 @@ $(CRYPTLIB_BUILD): $(3RDP_ROOT)$(DIRSEP)dist/cryptlib.zip $(3RDP_ROOT)$(DIRSEP)b
 	$(QUIET)patch -p0 -d $(CRYPT_SRC) < random_exit.patch
 	$(QUIET)patch -p0 -d $(CRYPT_SRC) < SSL-fix.patch
 	$(QUIET)patch -p0 -d $(CRYPT_SRC) < Dynamic-linked-static-lib.patch
+	$(QUIET)patch -p0 -d $(CRYPT_SRC) < terminal-params.patch
 	$(QUIET)cd $(CRYPT_SRC) && env - PATH=$(PATH) make
 	$(QUIET)cp $(CRYPT_SRC)$(DIRSEP)libcl.a $(CRYPT_IDIR)
 	$(QUIET)cp $(CRYPT_SRC)$(DIRSEP)cryptlib.h $(CRYPT_IDIR)
diff --git a/3rdp/build/terminal-params.patch b/3rdp/build/terminal-params.patch
new file mode 100644
index 0000000000..71c2221cf5
--- /dev/null
+++ b/3rdp/build/terminal-params.patch
@@ -0,0 +1,181 @@
+diff -ur ../cl.patched/cryptapi.c ./cryptapi.c
+--- ../cl.patched/cryptapi.c	2014-06-20 12:40:45.000000000 -0700
++++ ./cryptapi.c	2014-06-20 19:11:53.000000000 -0700
+@@ -1060,6 +1060,7 @@
+ 			}
+ 		else
+ 			{
++fprintf(stderr, "That's weird\n");
+ 			if( cmd->strArgLen[ 0 ] < 1 || \
+ 				cmd->strArgLen[ 0 ] >= MAX_ATTRIBUTE_SIZE )
+ 				return( CRYPT_ARGERROR_NUM2 );
+@@ -1079,6 +1080,7 @@
+ 									 ( MESSAGE_CAST ) &cmd->arg[ 2 ],
+ 									 cmd->arg[ 1 ] ) );
+ 			}
++fprintf(stderr, "First one\n");
+ 		return( krnlSendMessage( cmd->arg[ 0 ], MESSAGE_SETATTRIBUTE,
+ 								 ( MESSAGE_CAST ) &cmd->arg[ 2 ], cmd->arg[ 1 ] ) );
+ 		}
+@@ -1089,6 +1091,7 @@
+ 								 IMESSAGE_SETATTRIBUTE_S, &msgData,
+ 								 cmd->arg[ 1 ] ) );
+ 		}
++fprintf(stderr, "Last one\n");
+ 	return( krnlSendMessage( cmd->arg[ 0 ], MESSAGE_SETATTRIBUTE_S,
+ 							 &msgData, cmd->arg[ 1 ] ) );
+ 	}
+@@ -2558,9 +2561,11 @@
+ 	/* Perform basic client-side error checking */
+ 	if( !isHandleRangeValid( cryptHandle ) && cryptHandle != CRYPT_UNUSED )
+ 		return( CRYPT_ERROR_PARAM1 );
++fprintf(stderr, "Checking\n");
+ 	if( attributeType <= CRYPT_ATTRIBUTE_NONE || \
+ 		attributeType >= CRYPT_ATTRIBUTE_LAST )
+ 		return( CRYPT_ERROR_PARAM2 );
++fprintf(stderr, "Good\n");
+ 	if( !isReadPtrConst( value, 1 ) )
+ 		return( CRYPT_ERROR_PARAM3 );
+ 	if( attributeType == CRYPT_CTXINFO_KEY_COMPONENTS )
+@@ -2671,6 +2676,7 @@
+ 	cmd.strArg[ 0 ] = ( void * ) value;
+ 	cmd.strArgLen[ 0 ] = length;
+ 	status = DISPATCH_COMMAND( cmdSetAttribute, cmd );
++fprintf(stderr, "Dispatched return: %d\n", status);
+ 	if( cryptStatusOK( status ) )
+ 		return( CRYPT_OK );
+ 	return( mapError( errorMap, FAILSAFE_ARRAYSIZE( errorMap, ERRORMAP ), 
+diff -ur ../cl.patched/cryptlib.h ./cryptlib.h
+--- ../cl.patched/cryptlib.h	2014-06-20 12:40:45.000000000 -0700
++++ ./cryptlib.h	2014-06-20 12:47:00.000000000 -0700
+@@ -1237,6 +1237,11 @@
+ 	CRYPT_SESSINFO_SSL_OPTIONS,		/* SSL/TLS protocol options */
+ 	CRYPT_SESSINFO_TSP_MSGIMPRINT,	/* TSP message imprint */
+ 
++	/* Terminal attributes */
++	CRYPT_SESSINFO_SSH_TERMINAL,	/* TERM string sent to remote */
++	CRYPT_SESSINFO_SSH_WIDTH,	/* Terminal width */
++	CRYPT_SESSINFO_SSH_HEIGHT,	/* Terminal height */
++
+ 	/* Used internally */
+ 	CRYPT_SESSINFO_LAST, CRYPT_USERINFO_FIRST = 7000,
+ 
+diff -ur ../cl.patched/kernel/attr_acl.c ./kernel/attr_acl.c
+--- ../cl.patched/kernel/attr_acl.c	2014-06-20 12:40:39.000000000 -0700
++++ ./kernel/attr_acl.c	2014-06-20 20:32:54.000000000 -0700
+@@ -3742,6 +3742,25 @@
+ 		MKPERM_TSP( xWD_xWD ),
+ 		ROUTE( OBJECT_TYPE_SESSION ), &objectCtxHash ),
+ 
++	MKACL_S(	/* SSH client: Read/write */
++		CRYPT_SESSINFO_SSH_TERMINAL,
++		ST_NONE, ST_NONE, ST_SESS_SSH, 
++		0xffffffff /*MKPERM_SSH_EXT( RWD_RWD )*/,
++		ROUTE( OBJECT_TYPE_SESSION ),
++		RANGE( 1, CRYPT_MAX_TEXTSIZE ) ),
++	MKACL_N(	/* SSH client: Read/write */
++		CRYPT_SESSINFO_SSH_WIDTH,
++		ST_NONE, ST_NONE, ST_SESS_SSH, 
++		0xffffffff /*MKPERM_SSH_EXT( RWD_RWD )*/,
++		ROUTE( OBJECT_TYPE_SESSION ),
++		RANGE( 1, 800 ) ),
++	MKACL_N(	/* SSH client: Read/write */
++		CRYPT_SESSINFO_SSH_HEIGHT,
++		ST_NONE, ST_NONE, ST_SESS_SSH, 
++		0xffffffff /*MKPERM_SSH_EXT( RWD_RWD )*/,
++		ROUTE( OBJECT_TYPE_SESSION ),
++		RANGE( 1, 800 ) ),
++
+ 	MKACL_END(), MKACL_END()
+ 	};
+ 
+diff -ur ../cl.patched/session/sess_attr.c ./session/sess_attr.c
+--- ../cl.patched/session/sess_attr.c	2014-06-20 12:40:41.000000000 -0700
++++ ./session/sess_attr.c	2014-06-20 20:33:27.000000000 -0700
+@@ -323,6 +323,8 @@
+ 						TRUE : FALSE;
+ 			return( CRYPT_OK );
+ 
++		case CRYPT_SESSINFO_SSH_WIDTH:
++		case CRYPT_SESSINFO_SSH_HEIGHT:
+ 		case CRYPT_SESSINFO_SERVER_PORT:
+ 		case CRYPT_SESSINFO_CLIENT_PORT:
+ 			{
+@@ -392,6 +394,7 @@
+ 			return( CRYPT_ERROR_NOTFOUND );
+ 			}
+ 
++		case CRYPT_SESSINFO_SSH_TERMINAL:
+ 		case CRYPT_SESSINFO_USERNAME:
+ 		case CRYPT_SESSINFO_PASSWORD:
+ 		case CRYPT_SESSINFO_SERVER_FINGERPRINT:
+@@ -532,6 +535,13 @@
+ 			return( status );
+ 			}
+ 
++		case CRYPT_SESSINFO_SSH_WIDTH:
++			return( addSessionInfo( &sessionInfoPtr->attributeList,
++									CRYPT_SESSINFO_SSH_WIDTH, value ) );
++		case CRYPT_SESSINFO_SSH_HEIGHT:
++			return( addSessionInfo( &sessionInfoPtr->attributeList,
++									CRYPT_SESSINFO_SSH_HEIGHT, value ) );
++
+ 		case CRYPT_SESSINFO_SERVER_PORT:
+ 			/* If there's already a transport session or network socket 
+ 			   specified then we can't set a port as well */
+@@ -883,6 +893,7 @@
+ 									  attribute, data, dataLength, flags ) );
+ 			}
+ 
++		case CRYPT_SESSINFO_SSH_TERMINAL:
+ 		case CRYPT_SESSINFO_SERVER_FINGERPRINT:
+ 			/* Remember the value */
+ 			return( addSessionInfoS( &sessionInfoPtr->attributeList,
+@@ -938,6 +949,9 @@
+ 			sessionInfoPtr->writeTimeout = CRYPT_ERROR;
+ 			return( CRYPT_OK );
+ 
++		case CRYPT_SESSINFO_SSH_TERMINAL:
++		case CRYPT_SESSINFO_SSH_WIDTH:
++		case CRYPT_SESSINFO_SSH_HEIGHT:
+ 		case CRYPT_SESSINFO_USERNAME:
+ 		case CRYPT_SESSINFO_PASSWORD:
+ 		case CRYPT_SESSINFO_SERVER_NAME:
+diff -ur ../cl.patched/session/ssh2_msgc.c ./session/ssh2_msgc.c
+--- ../cl.patched/session/ssh2_msgc.c	2014-06-20 12:40:41.000000000 -0700
++++ ./session/ssh2_msgc.c	2014-06-20 20:36:36.000000000 -0700
+@@ -447,6 +447,12 @@
+ 												CHANNEL_WRITE );
+ 	int packetOffset, status;
+ 
++	MESSAGE_DATA	term;
++	BYTE termString[ CRYPT_MAX_TEXTSIZE + 8 ];
++	int value;
++
++	term.data=termString;
++	term.length=CRYPT_MAX_TEXTSIZE;
+ 	assert( isWritePtr( sessionInfoPtr, sizeof( SESSION_INFO ) ) );
+ 	assert( isWritePtr( stream, sizeof( STREAM ) ) );
+ 
+@@ -545,9 +551,18 @@
+ 	writeUint32( stream, channelNo );
+ 	writeString32( stream, "pty-req", 7 );
+ 	sputc( stream, 0 );					/* No reply */
+-	writeString32( stream, "xterm", 5 );/* Generic */
+-	writeUint32( stream, 80 );
+-	writeUint32( stream, 48 );			/* 48 x 80 (24 x 80 is so 1970s) */
++	if( cryptStatusError( status = getSessionAttributeS( sessionInfoPtr, &term, CRYPT_SESSINFO_SSH_TERMINAL) ) )
++		writeString32( stream, "xterm", 5 );/* Generic */
++	else
++		writeString32( stream, term.data, term.length );/* Generic */
++	if( cryptStatusError( getSessionAttribute( sessionInfoPtr, &value, CRYPT_SESSINFO_SSH_WIDTH ) ) )
++		writeUint32( stream, 80 );
++	else
++		writeUint32( stream, value);
++	if( cryptStatusError( getSessionAttribute( sessionInfoPtr, &value, CRYPT_SESSINFO_SSH_HEIGHT ) ) )
++		writeUint32( stream, 48 );		/* 48 x 80 (24 x 80 is so 1970s) */
++	else
++		writeUint32( stream, value);
+ 	writeUint32( stream, 0 );
+ 	writeUint32( stream, 0 );			/* No graphics capabilities */
+ 	status = writeUint32( stream, 0 );	/* No special TTY modes */
-- 
GitLab