From a62c467f71b2bc94ba766cfe14dd971049b2e880 Mon Sep 17 00:00:00 2001 From: speidy Date: Thu, 29 Dec 2016 00:33:17 -0500 Subject: [PATCH 1/3] libxrdp: frame acks, make sure max unacked frames value is valid. --- libxrdp/xrdp_caps.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/libxrdp/xrdp_caps.c b/libxrdp/xrdp_caps.c index ec971648..66c8c88d 100644 --- a/libxrdp/xrdp_caps.c +++ b/libxrdp/xrdp_caps.c @@ -539,6 +539,10 @@ xrdp_caps_process_frame_ack(struct xrdp_rdp *self, struct stream *s, int len) g_writeln("xrdp_caps_process_frame_ack:"); self->client_info.use_frame_acks = 1; in_uint32_le(s, self->client_info.max_unacknowledged_frame_count); + if (self->client_info.max_unacknowledged_frame_count < 0) + { + self->client_info.max_unacknowledged_frame_count = 0; + } g_writeln(" max_unacknowledged_frame_count %d", self->client_info.max_unacknowledged_frame_count); return 0; } From 1f930f252ff1ccac30bae24740b0a2a7fd6f6bac Mon Sep 17 00:00:00 2001 From: speidy Date: Thu, 29 Dec 2016 00:41:16 -0500 Subject: [PATCH 2/3] xrdp: fix for codec frame acks handling. can handle zero unacked frames now. This should make RemoteFX usable with Parallels Client. they always wan't zero unacked frames on the wire. --- xrdp/xrdp_mm.c | 17 +---------------- 1 file changed, 1 insertion(+), 16 deletions(-) diff --git a/xrdp/xrdp_mm.c b/xrdp/xrdp_mm.c index bb6bc5d8..0e6c3e54 100644 --- a/xrdp/xrdp_mm.c +++ b/xrdp/xrdp_mm.c @@ -2258,21 +2258,6 @@ xrdp_mm_check_wait_objs(struct xrdp_mm *self) enc_done->enc->flags, enc_done->enc->frame_id); } - else - { -#if 1 - ex = self->wm->client_info->max_unacknowledged_frame_count; - if (self->encoder->frame_id_client + ex > self->encoder->frame_id_server) - { - if (self->encoder->frame_id_server > self->encoder->frame_id_server_sent) - { - LLOGLN(10, ("xrdp_mm_check_wait_objs: 1 -- %d", self->encoder->frame_id_server)); - self->encoder->frame_id_server_sent = self->encoder->frame_id_server; - self->mod->mod_frame_ack(self->mod, 0, self->encoder->frame_id_server); - } - } -#endif - } g_free(enc_done->enc->drects); g_free(enc_done->enc->crects); g_free(enc_done->enc); @@ -2303,7 +2288,7 @@ xrdp_mm_frame_ack(struct xrdp_mm *self, int frame_id) return 1; } ex = self->wm->client_info->max_unacknowledged_frame_count; - if (self->encoder->frame_id_client + ex > self->encoder->frame_id_server) + if (self->encoder->frame_id_client + ex >= self->encoder->frame_id_server) { if (self->encoder->frame_id_server > self->encoder->frame_id_server_sent) { From 70e9132ab1fa90c71ef034cddc2f2500ce528822 Mon Sep 17 00:00:00 2001 From: speidy Date: Thu, 29 Dec 2016 03:31:53 -0500 Subject: [PATCH 3/3] xrdp: add some logging, remove unused var --- libxrdp/xrdp_caps.c | 2 ++ xrdp/xrdp_mm.c | 5 +++-- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/libxrdp/xrdp_caps.c b/libxrdp/xrdp_caps.c index 66c8c88d..c4ec7b02 100644 --- a/libxrdp/xrdp_caps.c +++ b/libxrdp/xrdp_caps.c @@ -541,6 +541,8 @@ xrdp_caps_process_frame_ack(struct xrdp_rdp *self, struct stream *s, int len) in_uint32_le(s, self->client_info.max_unacknowledged_frame_count); if (self->client_info.max_unacknowledged_frame_count < 0) { + g_writeln(" invalid max_unacknowledged_frame_count value (%d), setting to 0", + self->client_info.max_unacknowledged_frame_count); self->client_info.max_unacknowledged_frame_count = 0; } g_writeln(" max_unacknowledged_frame_count %d", self->client_info.max_unacknowledged_frame_count); diff --git a/xrdp/xrdp_mm.c b/xrdp/xrdp_mm.c index 0e6c3e54..ea719417 100644 --- a/xrdp/xrdp_mm.c +++ b/xrdp/xrdp_mm.c @@ -2153,7 +2153,6 @@ xrdp_mm_check_wait_objs(struct xrdp_mm *self) int cx; int cy; int use_frame_acks; - int ex; if (self == 0) { @@ -2281,13 +2280,15 @@ xrdp_mm_frame_ack(struct xrdp_mm *self, int frame_id) { int ex; - LLOGLN(10, ("xrdp_mm_frame_ack:")); + LLOGLN(10, ("xrdp_mm_frame_ack: incoming %d, client %d, server %d", frame_id, + self->encoder->frame_id_client, self->encoder->frame_id_server)); self->encoder->frame_id_client = frame_id; if (self->wm->client_info->use_frame_acks == 0) { return 1; } ex = self->wm->client_info->max_unacknowledged_frame_count; + /* make sure we won't have too many in-flight frames */ if (self->encoder->frame_id_client + ex >= self->encoder->frame_id_server) { if (self->encoder->frame_id_server > self->encoder->frame_id_server_sent)