work on suppress

This commit is contained in:
Jay Sorg 2019-04-03 19:42:16 -07:00
parent ecf4acf5f1
commit 9e9cada4ec

View File

@ -1214,16 +1214,26 @@ static int
xrdp_rdp_process_suppress(struct xrdp_rdp *self, struct stream *s) xrdp_rdp_process_suppress(struct xrdp_rdp *self, struct stream *s)
{ {
int allowDisplayUpdates; int allowDisplayUpdates;
int left;
int top;
int right;
int bottom;
int cx;
int cy;
if (!s_check_rem(s, 1)) if (!s_check_rem(s, 1))
{ {
return 1; return 1;
} }
in_uint8(s, allowDisplayUpdates); in_uint8(s, allowDisplayUpdates);
g_writeln("xrdp_rdp_process_suppress: allowDisplayUpdates %d bytes "
"left %d", allowDisplayUpdates, (int) (s->end - s->p));
switch (allowDisplayUpdates) switch (allowDisplayUpdates)
{ {
case 0: /* SUPPRESS_DISPLAY_UPDATES */ case 0: /* SUPPRESS_DISPLAY_UPDATES */
self->client_info.suppress_output = 1; self->client_info.suppress_output = 1;
g_writeln("xrdp_rdp_process_suppress: suppress_output %d",
self->client_info.suppress_output);
break; break;
case 1: /* ALLOW_DISPLAY_UPDATES */ case 1: /* ALLOW_DISPLAY_UPDATES */
self->client_info.suppress_output = 0; self->client_info.suppress_output = 0;
@ -1232,10 +1242,21 @@ xrdp_rdp_process_suppress(struct xrdp_rdp *self, struct stream *s)
return 1; return 1;
} }
in_uint8s(s, 3); /* pad */ in_uint8s(s, 3); /* pad */
in_uint8s(s, 2); /* left */ in_uint16_le(s, left);
in_uint8s(s, 2); /* top */ in_uint16_le(s, top);
in_uint8s(s, 2); /* right */ in_uint16_le(s, right);
in_uint8s(s, 2); /* bottom */ in_uint16_le(s, bottom);
g_writeln("xrdp_rdp_process_suppress: suppress_output %d "
"left %d top %d right %d bottom %d",
self->client_info.suppress_output,
left, top, right, bottom);
cx = right - left;
cy = bottom - top;
if (self->session->callback != 0)
{
self->session->callback(self->session->id, 0x4444,
left, top, cx, cy);
}
break; break;
} }
return 0; return 0;
@ -1246,16 +1267,31 @@ xrdp_rdp_process_suppress(struct xrdp_rdp *self, struct stream *s)
int int
xrdp_rdp_process_data(struct xrdp_rdp *self, struct stream *s) xrdp_rdp_process_data(struct xrdp_rdp *self, struct stream *s)
{ {
int data_type; int uncompressedLength;
int pduType2;
int compressedType;
int compressedLength;
if (!s_check_rem(s, 12))
{
return 1;
}
in_uint8s(s, 6); in_uint8s(s, 6);
in_uint8s(s, 2); /* len */ in_uint16_le(s, uncompressedLength);
in_uint8(s, data_type); in_uint8(s, pduType2);
in_uint8s(s, 1); /* ctype */ in_uint8(s, compressedType);
in_uint8s(s, 2); /* clen */ in_uint16_le(s, compressedLength);
DEBUG(("xrdp_rdp_process_data code %d", data_type)); if (compressedType != 0)
{
switch (data_type) /* don't support compression */
return 1;
}
if (compressedLength > uncompressedLength)
{
return 1;
}
DEBUG(("xrdp_rdp_process_data pduType2 %d", pduType2));
switch (pduType2)
{ {
case RDP_DATA_PDU_POINTER: /* 27(0x1b) */ case RDP_DATA_PDU_POINTER: /* 27(0x1b) */
xrdp_rdp_process_data_pointer(self, s); xrdp_rdp_process_data_pointer(self, s);
@ -1288,10 +1324,9 @@ xrdp_rdp_process_data(struct xrdp_rdp *self, struct stream *s)
xrdp_rdp_process_frame_ack(self, s); xrdp_rdp_process_frame_ack(self, s);
break; break;
default: default:
g_writeln("unknown in xrdp_rdp_process_data %d", data_type); g_writeln("unknown in xrdp_rdp_process_data pduType2 %d", pduType2);
break; break;
} }
return 0; return 0;
} }
/*****************************************************************************/ /*****************************************************************************/