From 0983e771c8295a78904fdbdb75dde89de638e142 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Peter=20=C3=85strand?= Date: Tue, 12 Jan 2010 15:00:49 +0000 Subject: [PATCH] Only try to use automatic reconnect if we have earlier recieved the reconnect random. It seems to work anyway, but let's take care. git-svn-id: svn://svn.code.sf.net/p/rdesktop/code/rdesktop/trunk@1541 423420c4-83ab-492f-b58f-81f9feb106b5 --- rdesktop.c | 1 + rdp.c | 26 ++++++++++++++++++-------- 2 files changed, 19 insertions(+), 8 deletions(-) diff --git a/rdesktop.c b/rdesktop.c index 64f4bb3..b7ffd52 100644 --- a/rdesktop.c +++ b/rdesktop.c @@ -105,6 +105,7 @@ uint32 g_redirect_flags = 0; uint32 g_reconnect_logonid = 0; char g_reconnect_random[16]; +RD_BOOL g_has_reconnect_random = False; uint8 g_client_random[SEC_RANDOM_SIZE]; #ifdef WITH_RDPSND diff --git a/rdp.c b/rdp.c index 79dc37e..03d3bdd 100644 --- a/rdp.c +++ b/rdp.c @@ -70,6 +70,7 @@ extern uint32 g_redirect_flags; extern uint32 g_reconnect_logonid; extern char g_reconnect_random[16]; +extern RD_BOOL g_has_reconnect_random; extern uint8 g_client_random[SEC_RANDOM_SIZE]; #if WITH_DEBUG @@ -464,14 +465,22 @@ rdp_send_logon_info(uint32 flags, char *domain, char *user, out_uint32_le(s, g_rdp5_performanceflags); /* Client Auto-Reconnect */ - out_uint16_le(s, 28); /* cbAutoReconnectLen */ - /* ARC_CS_PRIVATE_PACKET */ - out_uint32_le(s, 28); /* cbLen */ - out_uint32_le(s, 1); /* Version */ - out_uint32_le(s, g_reconnect_logonid); /* LogonId */ - ssl_hmac_md5(g_reconnect_random, sizeof(g_reconnect_random), - g_client_random, SEC_RANDOM_SIZE, security_verifier); - out_uint8a(s, security_verifier, sizeof(security_verifier)); + if (g_has_reconnect_random) + { + out_uint16_le(s, 28); /* cbAutoReconnectLen */ + /* ARC_CS_PRIVATE_PACKET */ + out_uint32_le(s, 28); /* cbLen */ + out_uint32_le(s, 1); /* Version */ + out_uint32_le(s, g_reconnect_logonid); /* LogonId */ + ssl_hmac_md5(g_reconnect_random, sizeof(g_reconnect_random), + g_client_random, SEC_RANDOM_SIZE, security_verifier); + out_uint8a(s, security_verifier, sizeof(security_verifier)); + } + else + { + out_uint16_le(s, 0); /* cbAutoReconnectLen */ + } + } s_mark_end(s); sec_send(s, sec_flags); @@ -1357,6 +1366,7 @@ process_pdu_logon(STREAM s) in_uint32_le(s, g_reconnect_logonid); in_uint8a(s, g_reconnect_random, 16); + g_has_reconnect_random = True; DEBUG(("Saving auto-reconnect cookie, id=%u\n", g_reconnect_logonid)); } }