xup: add more forgiving X11rdp / xup messages with size

ulab-original
Jay Sorg 13 years ago
parent bd8a75fa7e
commit 67bd319adf

@ -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,29 +377,15 @@ 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)];
LIB_DEBUG(mod, "in lib_mod_signal");
make_stream(s);
init_stream(s, 8192);
rv = lib_recv(mod, s->data, 8);
if (rv == 0)
{
in_uint16_le(s, type);
in_uint16_le(s, num_orders);
in_uint32_le(s, len);
if (type == 1)
{
init_stream(s, len);
rv = lib_recv(mod, s->data, len);
if (rv == 0)
{
for (index = 0; index < num_orders; index++)
{
in_uint16_le(s, type);
rv = 0;
switch (type)
{
case 1: /* server_begin_update */
@ -486,9 +463,46 @@ lib_mod_signal(struct mod* mod)
rv = mod->server_set_cursor(mod, x, y, cur_data, cur_mask);
break;
default:
rv = 1;
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);
rv = lib_recv(mod, s->data, 8);
if (rv == 0)
{
in_uint16_le(s, type);
in_uint16_le(s, num_orders);
in_uint32_le(s, len);
if (type == 1) /* original order list */
{
init_stream(s, len);
rv = lib_recv(mod, s->data, len);
if (rv == 0)
{
for (index = 0; index < num_orders; index++)
{
in_uint16_le(s, type);
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);

Loading…
Cancel
Save