diff --git a/libxrdp/xrdp_orders.c b/libxrdp/xrdp_orders.c index 7ce5a21b..52d043c9 100644 --- a/libxrdp/xrdp_orders.c +++ b/libxrdp/xrdp_orders.c @@ -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 * @@ -220,13 +221,15 @@ int xrdp_orders_check(struct xrdp_orders *self, int max_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 (max_size > max_packet_size) + if (max_size > max_order_size) { 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); return 1; } - if (size > max_packet_size) + if (size > max_order_size) { /* this suggests someone calls this function without passing the correct max_size so we end up putting more into the buffer than we indicate we can */ g_writeln("error in xrdp_orders_check, size too big: %d bytes", size); /* 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 the text len to check the buffer size. So attempt to send the data anyway. @@ -258,7 +261,7 @@ xrdp_orders_check(struct xrdp_orders *self, int max_size) /* 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_init(self); @@ -2217,6 +2220,8 @@ xrdp_orders_send_raw_bitmap(struct xrdp_orders *self, int j = 0; int pixel = 0; int e = 0; + int max_order_size; + struct xrdp_client_info *ci; if (width > 64) { @@ -2239,7 +2244,9 @@ xrdp_orders_send_raw_bitmap(struct xrdp_orders *self, Bpp = (bpp + 7) / 8; 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--; bufsize = (width + e) * height * Bpp; @@ -2339,6 +2346,8 @@ xrdp_orders_send_bitmap(struct xrdp_orders *self, struct stream *s = NULL; struct stream *temp_s = NULL; char *p = NULL; + int max_order_size; + struct xrdp_client_info *ci; if (width > 64) { @@ -2352,6 +2361,9 @@ xrdp_orders_send_bitmap(struct xrdp_orders *self, return 1; } + ci = &(self->rdp_layer->client_info); + max_order_size = MAX_ORDERS_SIZE(ci); + e = width % 4; if (e != 0) @@ -2368,13 +2380,13 @@ xrdp_orders_send_bitmap(struct xrdp_orders *self, if (bpp > 24) { lines_sending = xrdp_bitmap32_compress(data, width, height, s, - bpp, MAX_ORDERS_SIZE, + bpp, max_order_size, i - 1, temp_s, e, 0x10); } else { lines_sending = xrdp_bitmap_compress(data, width, height, s, - bpp, MAX_ORDERS_SIZE, + bpp, max_order_size, i - 1, temp_s, e); } @@ -2490,8 +2502,9 @@ xrdp_orders_send_raw_bitmap2(struct xrdp_orders *self, int j = 0; int pixel = 0; int e = 0; + int max_order_size; + struct xrdp_client_info *ci; - g_writeln("xrdp_orders_send_raw_bitmap2:"); if (width > 64) { g_writeln("error, width > 64"); @@ -2504,6 +2517,9 @@ xrdp_orders_send_raw_bitmap2(struct xrdp_orders *self, return 1; } + ci = &(self->rdp_layer->client_info); + max_order_size = MAX_ORDERS_SIZE(ci); + e = width % 4; if (e != 0) @@ -2513,7 +2529,7 @@ xrdp_orders_send_raw_bitmap2(struct xrdp_orders *self, Bpp = (bpp + 7) / 8; bufsize = (width + e) * height * Bpp; - while (bufsize + 14 > MAX_ORDERS_SIZE) + while (bufsize + 14 > max_order_size) { height--; bufsize = (width + e) * height * Bpp; @@ -2614,6 +2630,8 @@ xrdp_orders_send_bitmap2(struct xrdp_orders *self, struct stream *s = NULL; struct stream *temp_s = NULL; char *p = NULL; + int max_order_size; + struct xrdp_client_info *ci; if (width > 64) { @@ -2627,6 +2645,9 @@ xrdp_orders_send_bitmap2(struct xrdp_orders *self, return 1; } + ci = &(self->rdp_layer->client_info); + max_order_size = MAX_ORDERS_SIZE(ci); + e = width % 4; if (e != 0) @@ -2643,13 +2664,13 @@ xrdp_orders_send_bitmap2(struct xrdp_orders *self, if (bpp > 24) { lines_sending = xrdp_bitmap32_compress(data, width, height, s, - bpp, MAX_ORDERS_SIZE, + bpp, max_order_size, i - 1, temp_s, e, 0x10); } else { lines_sending = xrdp_bitmap_compress(data, width, height, s, - bpp, MAX_ORDERS_SIZE, + bpp, max_order_size, i - 1, temp_s, e); }