summaryrefslogtreecommitdiffstats
path: root/xup/xup.c
diff options
context:
space:
mode:
authorJay Sorg <jay.sorg@gmail.com>2012-05-12 20:52:43 -0700
committerJay Sorg <jay.sorg@gmail.com>2012-05-12 20:52:43 -0700
commit67bd319adf4fafabcb1ea9124b8d64209d3ebcf7 (patch)
tree06b0d1744f8a2fb12ab2eda420997090e4062a91 /xup/xup.c
parentbd8a75fa7ee417116f737081eec2ae3cdf3300a6 (diff)
downloadxrdp-proprietary-67bd319adf4fafabcb1ea9124b8d64209d3ebcf7.tar.gz
xrdp-proprietary-67bd319adf4fafabcb1ea9124b8d64209d3ebcf7.zip
xup: add more forgiving X11rdp / xup messages with size
Diffstat (limited to 'xup/xup.c')
-rw-r--r--xup/xup.c220
1 files changed, 127 insertions, 93 deletions
diff --git a/xup/xup.c b/xup/xup.c
index adcfde89..449ec5f7 100644
--- a/xup/xup.c
+++ b/xup/xup.c
@@ -361,23 +361,14 @@ lib_mod_event(struct mod* mod, int msg, tbus param1, tbus param2,
/******************************************************************************/
/* return error */
-int DEFAULT_CC
-lib_mod_signal(struct mod* mod)
+static int
+lib_mod_process_orders(struct mod* mod, int type, struct stream* s)
{
- struct stream* s;
- int num_orders;
- int index;
int rv;
- int len;
- int type;
int x;
int y;
int cx;
int cy;
- int fgcolor;
- int opcode;
- int width;
- int height;
int srcx;
int srcy;
int len_bmpdata;
@@ -386,11 +377,113 @@ lib_mod_signal(struct mod* mod)
int y1;
int x2;
int y2;
- char* phold;
+ int width;
+ int height;
+ int fgcolor;
+ int opcode;
char* bmpdata;
char cur_data[32 * (32 * 3)];
char cur_mask[32 * (32 / 8)];
+ rv = 0;
+ switch (type)
+ {
+ case 1: /* server_begin_update */
+ rv = mod->server_begin_update(mod);
+ break;
+ case 2: /* server_end_update */
+ rv = mod->server_end_update(mod);
+ break;
+ case 3: /* server_fill_rect */
+ in_sint16_le(s, x);
+ in_sint16_le(s, y);
+ in_uint16_le(s, cx);
+ in_uint16_le(s, cy);
+ rv = mod->server_fill_rect(mod, x, y, cx, cy);
+ break;
+ case 4: /* server_screen_blt */
+ in_sint16_le(s, x);
+ in_sint16_le(s, y);
+ in_uint16_le(s, cx);
+ in_uint16_le(s, cy);
+ in_sint16_le(s, srcx);
+ in_sint16_le(s, srcy);
+ rv = mod->server_screen_blt(mod, x, y, cx, cy, srcx, srcy);
+ break;
+ case 5: /* server_paint_rect */
+ in_sint16_le(s, x);
+ in_sint16_le(s, y);
+ in_uint16_le(s, cx);
+ in_uint16_le(s, cy);
+ in_uint32_le(s, len_bmpdata);
+ in_uint8p(s, bmpdata, len_bmpdata);
+ in_uint16_le(s, width);
+ in_uint16_le(s, height);
+ in_sint16_le(s, srcx);
+ in_sint16_le(s, srcy);
+ rv = mod->server_paint_rect(mod, x, y, cx, cy,
+ bmpdata, width, height,
+ srcx, srcy);
+ break;
+ case 10: /* server_set_clip */
+ in_sint16_le(s, x);
+ in_sint16_le(s, y);
+ in_uint16_le(s, cx);
+ in_uint16_le(s, cy);
+ rv = mod->server_set_clip(mod, x, y, cx, cy);
+ break;
+ case 11: /* server_reset_clip */
+ rv = mod->server_reset_clip(mod);
+ break;
+ case 12: /* server_set_fgcolor */
+ in_uint32_le(s, fgcolor);
+ rv = mod->server_set_fgcolor(mod, fgcolor);
+ break;
+ case 14:
+ in_uint16_le(s, opcode);
+ rv = mod->server_set_opcode(mod, opcode);
+ break;
+ case 17:
+ in_uint16_le(s, style);
+ in_uint16_le(s, width);
+ rv = mod->server_set_pen(mod, style, width);
+ break;
+ case 18:
+ in_sint16_le(s, x1);
+ in_sint16_le(s, y1);
+ in_sint16_le(s, x2);
+ in_sint16_le(s, y2);
+ rv = mod->server_draw_line(mod, x1, y1, x2, y2);
+ break;
+ case 19:
+ in_sint16_le(s, x);
+ in_sint16_le(s, y);
+ in_uint8a(s, cur_data, 32 * (32 * 3));
+ in_uint8a(s, cur_mask, 32 * (32 / 8));
+ rv = mod->server_set_cursor(mod, x, y, cur_data, cur_mask);
+ break;
+ default:
+ g_writeln("lib_mod_process_orders: unknown order type %d", type);
+ rv = 0;
+ break;
+ }
+ return rv;
+}
+
+
+/******************************************************************************/
+/* return error */
+int DEFAULT_CC
+lib_mod_signal(struct mod* mod)
+{
+ struct stream* s;
+ int num_orders;
+ int index;
+ int rv;
+ int len;
+ int type;
+ char* phold;
+
LIB_DEBUG(mod, "in lib_mod_signal");
make_stream(s);
init_stream(s, 8192);
@@ -400,7 +493,7 @@ lib_mod_signal(struct mod* mod)
in_uint16_le(s, type);
in_uint16_le(s, num_orders);
in_uint32_le(s, len);
- if (type == 1)
+ if (type == 1) /* original order list */
{
init_stream(s, len);
rv = lib_recv(mod, s->data, len);
@@ -409,86 +502,7 @@ lib_mod_signal(struct mod* mod)
for (index = 0; index < num_orders; index++)
{
in_uint16_le(s, type);
- switch (type)
- {
- case 1: /* server_begin_update */
- rv = mod->server_begin_update(mod);
- break;
- case 2: /* server_end_update */
- rv = mod->server_end_update(mod);
- break;
- case 3: /* server_fill_rect */
- in_sint16_le(s, x);
- in_sint16_le(s, y);
- in_uint16_le(s, cx);
- in_uint16_le(s, cy);
- rv = mod->server_fill_rect(mod, x, y, cx, cy);
- break;
- case 4: /* server_screen_blt */
- in_sint16_le(s, x);
- in_sint16_le(s, y);
- in_uint16_le(s, cx);
- in_uint16_le(s, cy);
- in_sint16_le(s, srcx);
- in_sint16_le(s, srcy);
- rv = mod->server_screen_blt(mod, x, y, cx, cy, srcx, srcy);
- break;
- case 5: /* server_paint_rect */
- in_sint16_le(s, x);
- in_sint16_le(s, y);
- in_uint16_le(s, cx);
- in_uint16_le(s, cy);
- in_uint32_le(s, len_bmpdata);
- in_uint8p(s, bmpdata, len_bmpdata);
- in_uint16_le(s, width);
- in_uint16_le(s, height);
- in_sint16_le(s, srcx);
- in_sint16_le(s, srcy);
- rv = mod->server_paint_rect(mod, x, y, cx, cy,
- bmpdata, width, height,
- srcx, srcy);
- break;
- case 10: /* server_set_clip */
- in_sint16_le(s, x);
- in_sint16_le(s, y);
- in_uint16_le(s, cx);
- in_uint16_le(s, cy);
- rv = mod->server_set_clip(mod, x, y, cx, cy);
- break;
- case 11: /* server_reset_clip */
- rv = mod->server_reset_clip(mod);
- break;
- case 12: /* server_set_fgcolor */
- in_uint32_le(s, fgcolor);
- rv = mod->server_set_fgcolor(mod, fgcolor);
- break;
- case 14:
- in_uint16_le(s, opcode);
- rv = mod->server_set_opcode(mod, opcode);
- break;
- case 17:
- in_uint16_le(s, style);
- in_uint16_le(s, width);
- rv = mod->server_set_pen(mod, style, width);
- break;
- case 18:
- in_sint16_le(s, x1);
- in_sint16_le(s, y1);
- in_sint16_le(s, x2);
- in_sint16_le(s, y2);
- rv = mod->server_draw_line(mod, x1, y1, x2, y2);
- break;
- case 19:
- in_sint16_le(s, x);
- in_sint16_le(s, y);
- in_uint8a(s, cur_data, 32 * (32 * 3));
- in_uint8a(s, cur_mask, 32 * (32 / 8));
- rv = mod->server_set_cursor(mod, x, y, cur_data, cur_mask);
- break;
- default:
- rv = 1;
- break;
- }
+ rv = lib_mod_process_orders(mod, type, s);
if (rv != 0)
{
break;
@@ -519,6 +533,26 @@ lib_mod_signal(struct mod* mod)
}
}
}
+ else if (type == 3) /* order list with len after type */
+ {
+ init_stream(s, len);
+ rv = lib_recv(mod, s->data, len);
+ if (rv == 0)
+ {
+ for (index = 0; index < num_orders; index++)
+ {
+ phold = s->p;
+ in_uint16_le(s, type);
+ in_uint16_le(s, len);
+ rv = lib_mod_process_orders(mod, type, s);
+ if (rv != 0)
+ {
+ break;
+ }
+ s->p = phold + len;
+ }
+ }
+ }
else
{
g_writeln("unknown type %d", type);