Clarify the Fast-Path handling in the T.123/X.224 layer

This commit is contained in:
Karl Mikaelsson 2017-10-13 13:53:09 +02:00
parent eec94365c4
commit 63ac9d3c42
2 changed files with 21 additions and 7 deletions

View File

@ -23,6 +23,19 @@
#define DEFAULT_CODEPAGE "UTF-8"
#define WINDOWS_CODEPAGE "UTF-16LE"
/* T-REC-T.123-200701, section 8 */
#define T123_HEADER_VERSION 0x3
/* [MS-RDPBCGR] 2.2.9.1.2 */
#define FASTPATH_OUTPUT_ACTION_FASTPATH 0x0
#define FASTPATH_OUTPUT_ACTION_X224 T123_HEADER_VERSION
#define FASTPATH_OUTPUT_SECURE_CHECKSUM 0x1
#define FASTPATH_OUTPUT_ENCRYPTED 0x2
#define IS_FASTPATH(hdr) ((hdr & 0x03) == FASTPATH_OUTPUT_ACTION_FASTPATH)
#define IS_SLOWPATH(hdr) ((hdr) == FASTPATH_OUTPUT_ACTION_X224)
/* [MS-RDPBCGR] 2.2.9.1.2.1 */
/* adjusted for position in updateHeader */
#define FASTPATH_UPDATETYPE_ORDERS 0x0

15
iso.c
View File

@ -110,16 +110,17 @@ iso_recv_msg(uint8 * code, uint8 * rdpver)
in_uint8(s, version);
if (rdpver != NULL)
*rdpver = version;
if (version == 3)
if (IS_SLOWPATH(version))
{
in_uint8s(s, 1); /* pad */
in_uint16_be(s, length);
in_uint8s(s, 1); /* reserved */
in_uint16_be(s, length); /* length */
}
else
{
in_uint8(s, length);
in_uint8(s, length); /* length1 */
if (length & 0x80)
{
/* length2 is only present if the most significant bit of length1 is set */
length &= ~0x80;
next_be(s, length);
}
@ -132,7 +133,7 @@ iso_recv_msg(uint8 * code, uint8 * rdpver)
s = tcp_recv(s, length - 4);
if (s == NULL)
return NULL;
if (version != 3)
if (IS_FASTPATH(version))
return s;
in_uint8s(s, 1); /* hdrlen */
in_uint8(s, *code);
@ -166,7 +167,7 @@ iso_send(STREAM s)
s_pop_layer(s, iso_hdr);
length = s->end - s->p;
out_uint8(s, 3); /* version */
out_uint8(s, T123_HEADER_VERSION); /* version */
out_uint8(s, 0); /* reserved */
out_uint16_be(s, length);
@ -188,7 +189,7 @@ iso_recv(uint8 * rdpver)
if (s == NULL)
return NULL;
if (rdpver != NULL)
if (*rdpver != 3)
if (IS_FASTPATH(*rdpver))
return s;
if (code != ISO_PDU_DT)
{