fix for protocol error when 32 bit and non rfx

master
Jay Sorg 7 years ago committed by metalefty
parent 8c74fcb80c
commit 9d36983ae7

@ -38,7 +38,8 @@
} \ } \
} }
#define MAX_ORDERS_SIZE (16 * 1024 - 256) #define MAX_ORDERS_SIZE(_client_info) \
(MAX((_client_info)->max_fastpath_frag_bytes, 16 * 1024) - 256);
/*****************************************************************************/ /*****************************************************************************/
struct xrdp_orders * struct xrdp_orders *
@ -220,13 +221,15 @@ int
xrdp_orders_check(struct xrdp_orders *self, int max_size) xrdp_orders_check(struct xrdp_orders *self, int max_size)
{ {
int size; int size;
int max_packet_size; int max_order_size;
struct xrdp_client_info *ci;
max_packet_size = MAX_ORDERS_SIZE; ci = &(self->rdp_layer->client_info);
max_order_size = MAX_ORDERS_SIZE(ci);
if (self->order_level < 1) if (self->order_level < 1)
{ {
if (max_size > max_packet_size) if (max_size > max_order_size)
{ {
return 1; return 1;
} }
@ -243,14 +246,14 @@ xrdp_orders_check(struct xrdp_orders *self, int max_size)
g_writeln("error in xrdp_orders_check, size too small: %d bytes", size); g_writeln("error in xrdp_orders_check, size too small: %d bytes", size);
return 1; return 1;
} }
if (size > max_packet_size) if (size > max_order_size)
{ {
/* this suggests someone calls this function without passing the /* this suggests someone calls this function without passing the
correct max_size so we end up putting more into the buffer correct max_size so we end up putting more into the buffer
than we indicate we can */ than we indicate we can */
g_writeln("error in xrdp_orders_check, size too big: %d bytes", size); g_writeln("error in xrdp_orders_check, size too big: %d bytes", size);
/* We where getting called with size already greater than /* We where getting called with size already greater than
max_packet_size max_order_size
Which I suspect was because the sending of text did not include Which I suspect was because the sending of text did not include
the text len to check the buffer size. So attempt to send the data the text len to check the buffer size. So attempt to send the data
anyway. anyway.
@ -258,7 +261,7 @@ xrdp_orders_check(struct xrdp_orders *self, int max_size)
/* return 1; */ /* return 1; */
} }
if ((size + max_size + 100) > max_packet_size) if ((size + max_size + 100) > max_order_size)
{ {
xrdp_orders_force_send(self); xrdp_orders_force_send(self);
xrdp_orders_init(self); xrdp_orders_init(self);
@ -2217,6 +2220,8 @@ xrdp_orders_send_raw_bitmap(struct xrdp_orders *self,
int j = 0; int j = 0;
int pixel = 0; int pixel = 0;
int e = 0; int e = 0;
int max_order_size;
struct xrdp_client_info *ci;
if (width > 64) if (width > 64)
{ {
@ -2239,7 +2244,9 @@ xrdp_orders_send_raw_bitmap(struct xrdp_orders *self,
Bpp = (bpp + 7) / 8; Bpp = (bpp + 7) / 8;
bufsize = (width + e) * height * Bpp; bufsize = (width + e) * height * Bpp;
while (bufsize + 16 > MAX_ORDERS_SIZE) ci = &(self->rdp_layer->client_info);
max_order_size = MAX_ORDERS_SIZE(ci);
while (bufsize + 16 > max_order_size)
{ {
height--; height--;
bufsize = (width + e) * height * Bpp; bufsize = (width + e) * height * Bpp;
@ -2339,6 +2346,8 @@ xrdp_orders_send_bitmap(struct xrdp_orders *self,
struct stream *s = NULL; struct stream *s = NULL;
struct stream *temp_s = NULL; struct stream *temp_s = NULL;
char *p = NULL; char *p = NULL;
int max_order_size;
struct xrdp_client_info *ci;
if (width > 64) if (width > 64)
{ {
@ -2352,6 +2361,9 @@ xrdp_orders_send_bitmap(struct xrdp_orders *self,
return 1; return 1;
} }
ci = &(self->rdp_layer->client_info);
max_order_size = MAX_ORDERS_SIZE(ci);
e = width % 4; e = width % 4;
if (e != 0) if (e != 0)
@ -2368,13 +2380,13 @@ xrdp_orders_send_bitmap(struct xrdp_orders *self,
if (bpp > 24) if (bpp > 24)
{ {
lines_sending = xrdp_bitmap32_compress(data, width, height, s, lines_sending = xrdp_bitmap32_compress(data, width, height, s,
bpp, MAX_ORDERS_SIZE, bpp, max_order_size,
i - 1, temp_s, e, 0x10); i - 1, temp_s, e, 0x10);
} }
else else
{ {
lines_sending = xrdp_bitmap_compress(data, width, height, s, lines_sending = xrdp_bitmap_compress(data, width, height, s,
bpp, MAX_ORDERS_SIZE, bpp, max_order_size,
i - 1, temp_s, e); i - 1, temp_s, e);
} }
@ -2490,8 +2502,9 @@ xrdp_orders_send_raw_bitmap2(struct xrdp_orders *self,
int j = 0; int j = 0;
int pixel = 0; int pixel = 0;
int e = 0; int e = 0;
int max_order_size;
struct xrdp_client_info *ci;
g_writeln("xrdp_orders_send_raw_bitmap2:");
if (width > 64) if (width > 64)
{ {
g_writeln("error, width > 64"); g_writeln("error, width > 64");
@ -2504,6 +2517,9 @@ xrdp_orders_send_raw_bitmap2(struct xrdp_orders *self,
return 1; return 1;
} }
ci = &(self->rdp_layer->client_info);
max_order_size = MAX_ORDERS_SIZE(ci);
e = width % 4; e = width % 4;
if (e != 0) if (e != 0)
@ -2513,7 +2529,7 @@ xrdp_orders_send_raw_bitmap2(struct xrdp_orders *self,
Bpp = (bpp + 7) / 8; Bpp = (bpp + 7) / 8;
bufsize = (width + e) * height * Bpp; bufsize = (width + e) * height * Bpp;
while (bufsize + 14 > MAX_ORDERS_SIZE) while (bufsize + 14 > max_order_size)
{ {
height--; height--;
bufsize = (width + e) * height * Bpp; bufsize = (width + e) * height * Bpp;
@ -2614,6 +2630,8 @@ xrdp_orders_send_bitmap2(struct xrdp_orders *self,
struct stream *s = NULL; struct stream *s = NULL;
struct stream *temp_s = NULL; struct stream *temp_s = NULL;
char *p = NULL; char *p = NULL;
int max_order_size;
struct xrdp_client_info *ci;
if (width > 64) if (width > 64)
{ {
@ -2627,6 +2645,9 @@ xrdp_orders_send_bitmap2(struct xrdp_orders *self,
return 1; return 1;
} }
ci = &(self->rdp_layer->client_info);
max_order_size = MAX_ORDERS_SIZE(ci);
e = width % 4; e = width % 4;
if (e != 0) if (e != 0)
@ -2643,13 +2664,13 @@ xrdp_orders_send_bitmap2(struct xrdp_orders *self,
if (bpp > 24) if (bpp > 24)
{ {
lines_sending = xrdp_bitmap32_compress(data, width, height, s, lines_sending = xrdp_bitmap32_compress(data, width, height, s,
bpp, MAX_ORDERS_SIZE, bpp, max_order_size,
i - 1, temp_s, e, 0x10); i - 1, temp_s, e, 0x10);
} }
else else
{ {
lines_sending = xrdp_bitmap_compress(data, width, height, s, lines_sending = xrdp_bitmap_compress(data, width, height, s,
bpp, MAX_ORDERS_SIZE, bpp, max_order_size,
i - 1, temp_s, e); i - 1, temp_s, e);
} }

Loading…
Cancel
Save