Committed load balancing fixes from Daniel Drown. Hopefully fixes bug

#2845414.



git-svn-id: svn://svn.code.sf.net/p/rdesktop/code/rdesktop/trunk@1557 423420c4-83ab-492f-b58f-81f9feb106b5
This commit is contained in:
Peter Åstrand 2010-01-21 09:24:40 +00:00
parent 6ee9faeffc
commit 42f4ca28d5
2 changed files with 94 additions and 32 deletions

View File

@ -455,3 +455,20 @@ enum RDP_INPUT_DEVICE
#define SCARD_LOCK_CHANNEL 2 #define SCARD_LOCK_CHANNEL 2
#define SCARD_LOCK_RDPDR 3 #define SCARD_LOCK_RDPDR 3
#define SCARD_LOCK_LAST 4 #define SCARD_LOCK_LAST 4
/* redirect flags, from [MS-RDPBCGR] 2.2.13.1 */
enum RDP_PDU_REDIRECT_FLAGS
{
PDU_REDIRECT_HAS_IP = 0x1,
PDU_REDIRECT_HAS_COOKIE = 0x2,
PDU_REDIRECT_HAS_USERNAME = 0x4,
PDU_REDIRECT_HAS_DOMAIN = 0x8,
PDU_REDIRECT_HAS_PASSWORD = 0x10,
PDU_REDIRECT_DONT_STORE_USERNAME = 0x20,
PDU_REDIRECT_USE_SMARTCARD = 0x40,
PDU_REDIRECT_INFORMATIONAL = 0x80,
PDU_REDIRECT_HAS_TARGET_FQDN = 0x100,
PDU_REDIRECT_HAS_TARGET_NETBIOS = 0x200,
PDU_REDIRECT_HAS_TARGET_IP_ARRAY = 0x800
};

109
rdp.c
View File

@ -1481,49 +1481,94 @@ process_redirect_pdu(STREAM s /*, uint32 * ext_disc_reason */ )
/* read connection flags */ /* read connection flags */
in_uint32_le(s, g_redirect_flags); in_uint32_le(s, g_redirect_flags);
/* read length of ip string */ if (g_redirect_flags & PDU_REDIRECT_HAS_IP)
in_uint32_le(s, len);
/* read ip string */
rdp_in_unistr(s, g_redirect_server, sizeof(g_redirect_server), len);
/* read length of cookie string */
in_uint32_le(s, len);
/* read cookie string (plain ASCII) */
if (len > sizeof(g_redirect_cookie) - 1)
{ {
uint32 rem = len - (sizeof(g_redirect_cookie) - 1); /* read length of ip string */
len = sizeof(g_redirect_cookie) - 1; in_uint32_le(s, len);
warning("Unexpectedly large redirection cookie\n"); /* read ip string */
in_uint8a(s, g_redirect_cookie, len); rdp_in_unistr(s, g_redirect_server, sizeof(g_redirect_server), len);
in_uint8s(s, rem);
} }
else
if (g_redirect_flags & PDU_REDIRECT_HAS_COOKIE)
{ {
in_uint8a(s, g_redirect_cookie, len); /* read length of cookie string */
in_uint32_le(s, len);
/* read cookie string (plain ASCII) */
if (len > sizeof(g_redirect_cookie) - 1)
{
uint32 rem = len - (sizeof(g_redirect_cookie) - 1);
len = sizeof(g_redirect_cookie) - 1;
warning("Unexpectedly large redirection cookie\n");
in_uint8a(s, g_redirect_cookie, len);
in_uint8s(s, rem);
}
else
{
in_uint8a(s, g_redirect_cookie, len);
}
g_redirect_cookie[len] = 0;
} }
g_redirect_cookie[len] = 0;
/* read length of username string */ if (g_redirect_flags & PDU_REDIRECT_HAS_USERNAME)
in_uint32_le(s, len); {
/* read length of username string */
in_uint32_le(s, len);
/* read username string */ /* read username string */
g_redirect_username = (char *) xmalloc(len + 1); g_redirect_username = (char *) xmalloc(len + 1);
rdp_in_unistr(s, g_redirect_username, strlen(g_redirect_username), len); rdp_in_unistr(s, g_redirect_username, strlen(g_redirect_username), len);
}
/* read length of domain string */ if (g_redirect_flags & PDU_REDIRECT_HAS_DOMAIN)
in_uint32_le(s, len); {
/* read length of domain string */
in_uint32_le(s, len);
/* read domain string */ /* read domain string */
rdp_in_unistr(s, g_redirect_domain, sizeof(g_redirect_domain), len); rdp_in_unistr(s, g_redirect_domain, sizeof(g_redirect_domain), len);
}
/* read length of password string */ if (g_redirect_flags & PDU_REDIRECT_HAS_PASSWORD)
in_uint32_le(s, len); {
/* read length of password string */
in_uint32_le(s, len);
/* read password string */ /* read password string */
rdp_in_unistr(s, g_redirect_password, sizeof(g_redirect_password), len); rdp_in_unistr(s, g_redirect_password, sizeof(g_redirect_password), len);
}
if (g_redirect_flags & PDU_REDIRECT_DONT_STORE_USERNAME)
{
warning("PDU_REDIRECT_DONT_STORE_USERNAME set\n");
}
if (g_redirect_flags & PDU_REDIRECT_USE_SMARTCARD)
{
warning("PDU_REDIRECT_USE_SMARTCARD set\n");
}
if (g_redirect_flags & PDU_REDIRECT_INFORMATIONAL)
{
warning("PDU_REDIRECT_INFORMATIONAL set\n");
}
if (g_redirect_flags & PDU_REDIRECT_HAS_TARGET_FQDN)
{
warning("PDU_REDIRECT_HAS_TARGET_FQDN set\n");
}
if (g_redirect_flags & PDU_REDIRECT_HAS_TARGET_NETBIOS)
{
warning("PDU_REDIRECT_HAS_TARGET_NETBIOS set\n");
}
if (g_redirect_flags & PDU_REDIRECT_HAS_TARGET_IP_ARRAY)
{
warning("PDU_REDIRECT_HAS_TARGET_IP_ARRAY set\n");
}
g_redirect = True; g_redirect = True;