diff --git a/.gitignore b/.gitignore index b16999e..67e4ead 100644 --- a/.gitignore +++ b/.gitignore @@ -52,3 +52,4 @@ /FreeRDP-2.4.0.tar.gz /FreeRDP-2.4.1.tar.gz /FreeRDP-2.5.0.tar.gz +/FreeRDP-2.6.1.tar.gz diff --git a/Added-more-log-messages-for-SurfaceCommand-failures.patch b/Added-more-log-messages-for-SurfaceCommand-failures.patch new file mode 100644 index 0000000..f8b91c7 --- /dev/null +++ b/Added-more-log-messages-for-SurfaceCommand-failures.patch @@ -0,0 +1,121 @@ +From 631e71bebd041fbac2932555f17de050f6def91f Mon Sep 17 00:00:00 2001 +From: Armin Novak +Date: Tue, 8 Mar 2022 15:01:09 +0100 +Subject: [PATCH] Added more log messages for SurfaceCommand failures + +(cherry picked from commit c6f204091291990f85c23450778fcab35571eed5) +--- + libfreerdp/core/surface.c | 40 ++++++++++++++++++++++++++++++++++++--- + 1 file changed, 37 insertions(+), 3 deletions(-) + +diff --git a/libfreerdp/core/surface.c b/libfreerdp/core/surface.c +index ca89d230c..a99da01f3 100644 +--- a/libfreerdp/core/surface.c ++++ b/libfreerdp/core/surface.c +@@ -37,7 +37,11 @@ static BOOL update_recv_surfcmd_bitmap_header_ex(wStream* s, TS_COMPRESSED_BITMA + return FALSE; + + if (Stream_GetRemainingLength(s) < 24) ++ { ++ WLog_ERR(TAG, "got %" PRIuz ", expected %" PRIuz " bytes", Stream_GetRemainingLength(s), ++ 24); + return FALSE; ++ } + + Stream_Read_UINT32(s, header->highUniqueId); + Stream_Read_UINT32(s, header->lowUniqueId); +@@ -54,7 +58,11 @@ static BOOL update_recv_surfcmd_bitmap_ex(wStream* s, TS_BITMAP_DATA_EX* bmp) + return FALSE; + + if (Stream_GetRemainingLength(s) < 12) ++ { ++ WLog_ERR(TAG, "got %" PRIuz ", expected %" PRIuz " bytes", Stream_GetRemainingLength(s), ++ 12); + return FALSE; ++ } + + Stream_Read_UINT8(s, bmp->bpp); + Stream_Read_UINT8(s, bmp->flags); +@@ -86,7 +94,11 @@ static BOOL update_recv_surfcmd_bitmap_ex(wStream* s, TS_BITMAP_DATA_EX* bmp) + } + + if (Stream_GetRemainingLength(s) < bmp->bitmapDataLength) ++ { ++ WLog_ERR(TAG, "expected bitmapDataLength %" PRIu32 ", not enough data", ++ bmp->bitmapDataLength); + return FALSE; ++ } + + pos = Stream_GetPosition(s) + bmp->bitmapDataLength; + bmp->bitmapData = Stream_Pointer(s); +@@ -132,7 +144,10 @@ static BOOL update_recv_surfcmd_surface_bits(rdpUpdate* update, wStream* s, UINT + SURFACE_BITS_COMMAND cmd = { 0 }; + + if (Stream_GetRemainingLength(s) < 8) ++ { ++ WLog_ERR(TAG, "got %" PRIuz ", expected %" PRIuz " bytes", Stream_GetRemainingLength(s), 8); + goto fail; ++ } + + cmd.cmdType = cmdType; + Stream_Read_UINT16(s, cmd.destLeft); +@@ -152,7 +167,12 @@ static BOOL update_recv_surfcmd_surface_bits(rdpUpdate* update, wStream* s, UINT + goto fail; + } + +- return update->SurfaceBits(update->context, &cmd); ++ if (!update->SurfaceBits(update->context, &cmd)) ++ { ++ WLog_DBG(TAG, "update->SurfaceBits implementation failed"); ++ goto fail; ++ } ++ return TRUE; + fail: + return FALSE; + } +@@ -162,7 +182,10 @@ static BOOL update_recv_surfcmd_frame_marker(rdpUpdate* update, wStream* s) + SURFACE_FRAME_MARKER marker; + + if (Stream_GetRemainingLength(s) < 6) ++ { ++ WLog_ERR(TAG, "got %" PRIuz ", expected %" PRIuz " bytes", Stream_GetRemainingLength(s), 6); + return FALSE; ++ } + + Stream_Read_UINT16(s, marker.frameAction); + Stream_Read_UINT32(s, marker.frameId); +@@ -176,7 +199,13 @@ static BOOL update_recv_surfcmd_frame_marker(rdpUpdate* update, wStream* s) + return FALSE; + } + +- return update->SurfaceFrameMarker(update->context, &marker); ++ if (!update->SurfaceFrameMarker(update->context, &marker)) ++ { ++ WLog_DBG(TAG, "update->SurfaceFrameMarker implementation failed"); ++ return FALSE; ++ } ++ ++ return TRUE; + } + + int update_recv_surfcmds(rdpUpdate* update, wStream* s) +@@ -246,10 +275,15 @@ static BOOL update_write_surfcmd_bitmap_ex(wStream* s, const TS_BITMAP_DATA_EX* + if (!Stream_EnsureRemainingCapacity(s, 12)) + return FALSE; + ++ if (bmp->codecID > UINT8_MAX) ++ { ++ WLog_ERR(TAG, "Invalid TS_BITMAP_DATA_EX::codecID=0x%04" PRIx16 "", bmp->codecID); ++ return FALSE; ++ } + Stream_Write_UINT8(s, bmp->bpp); + Stream_Write_UINT8(s, bmp->flags); + Stream_Write_UINT8(s, 0); /* reserved1, reserved2 */ +- Stream_Write_UINT8(s, bmp->codecID); ++ Stream_Write_UINT8(s, (UINT8)bmp->codecID); + Stream_Write_UINT16(s, bmp->width); + Stream_Write_UINT16(s, bmp->height); + Stream_Write_UINT32(s, bmp->bitmapDataLength); +-- +2.35.1 + diff --git a/Implemented-4341-Default-to-network-auto.patch b/Implemented-4341-Default-to-network-auto.patch new file mode 100644 index 0000000..a89d2df --- /dev/null +++ b/Implemented-4341-Default-to-network-auto.patch @@ -0,0 +1,79 @@ +From baf35cece9ff369d27deae1fed23d56907d82c31 Mon Sep 17 00:00:00 2001 +From: Armin Novak +Date: Thu, 29 Jul 2021 13:26:05 +0200 +Subject: [PATCH] Implemented #4341: Default to /network:auto + +If no arguments are supplied, default to the behaviour of +/network:auto. This ensures the default experience is using the +best available graphics options. +As soon as any /network, /bpp, /rfx, /gfx, ... argument is used +only use these. + +(cherry picked from commit d3168a1436eefe6864727991b18e458c2d6c87b3) +--- + client/common/cmdline.c | 28 ++++++++++++++++++++++++++++ + 1 file changed, 28 insertions(+) + +diff --git a/client/common/cmdline.c b/client/common/cmdline.c +index 15d481387..453a38c5f 100644 +--- a/client/common/cmdline.c ++++ b/client/common/cmdline.c +@@ -27,6 +27,8 @@ + #include + #include + ++#include ++ + #include + #include + #include +@@ -46,6 +48,8 @@ + #include "cmdline.h" + + #include ++ ++#define WINPR_ASSERT(x) assert(x) + #define TAG CLIENT_TAG("common.cmdline") + + static BOOL freerdp_client_print_codepages(const char* arg) +@@ -1567,6 +1571,28 @@ static BOOL parseSizeValue(const char* input, unsigned long* v1, unsigned long* + return TRUE; + } + ++static BOOL prepare_default_settings(rdpSettings* settings, const COMMAND_LINE_ARGUMENT_A* args, ++ BOOL rdp_file) ++{ ++ size_t x; ++ const char* arguments[] = { "network", "gfx", "rfx", "bpp" }; ++ WINPR_ASSERT(settings); ++ WINPR_ASSERT(args); ++ ++ if (rdp_file) ++ return FALSE; ++ ++ for (x = 0; x < ARRAYSIZE(arguments); x++) ++ { ++ const char* arg = arguments[x]; ++ COMMAND_LINE_ARGUMENT_A* p = CommandLineFindArgumentA(args, arg); ++ if (p && (p->Flags & COMMAND_LINE_ARGUMENT_PRESENT)) ++ return FALSE; ++ } ++ ++ return freerdp_set_connection_type(settings, CONNECTION_TYPE_AUTODETECT); ++} ++ + int freerdp_client_settings_parse_command_line_arguments(rdpSettings* settings, int argc, + char** argv, BOOL allowUnknown) + { +@@ -1637,6 +1663,8 @@ int freerdp_client_settings_parse_command_line_arguments(rdpSettings* settings, + + if (status < 0) + return status; ++ ++ prepare_default_settings(settings, largs, ext); + } + + CommandLineFindArgumentA(largs, "v"); +-- +2.35.1 + diff --git a/Workaround-for-MS-RDPBCGR-2.2.9.2.3-Frame-Marker-Com.patch b/Workaround-for-MS-RDPBCGR-2.2.9.2.3-Frame-Marker-Com.patch new file mode 100644 index 0000000..6be8d52 --- /dev/null +++ b/Workaround-for-MS-RDPBCGR-2.2.9.2.3-Frame-Marker-Com.patch @@ -0,0 +1,45 @@ +From 6462eca724a886e8c1abb5b41955108023d1c1e6 Mon Sep 17 00:00:00 2001 +From: Armin Novak +Date: Wed, 9 Mar 2022 09:01:11 +0100 +Subject: [PATCH] Workaround for [MS-RDPBCGR] 2.2.9.2.3 Frame Marker Command + (TS_FRAME_MARKER) + +Connections with windows 2016 and 2019 sometimes receive short +frame marker. Ignore these to prevent disconnects + +(cherry picked from commit 91ef44ed35c99c409d39f6c480592f8601b45e35) +--- + libfreerdp/core/surface.c | 11 +++++++++-- + 1 file changed, 9 insertions(+), 2 deletions(-) + +diff --git a/libfreerdp/core/surface.c b/libfreerdp/core/surface.c +index a99da01f3..e288799f1 100644 +--- a/libfreerdp/core/surface.c ++++ b/libfreerdp/core/surface.c +@@ -181,14 +181,21 @@ static BOOL update_recv_surfcmd_frame_marker(rdpUpdate* update, wStream* s) + { + SURFACE_FRAME_MARKER marker; + +- if (Stream_GetRemainingLength(s) < 6) ++ if (Stream_GetRemainingLength(s) < 2) + { + WLog_ERR(TAG, "got %" PRIuz ", expected %" PRIuz " bytes", Stream_GetRemainingLength(s), 6); + return FALSE; + } + + Stream_Read_UINT16(s, marker.frameAction); +- Stream_Read_UINT32(s, marker.frameId); ++ if (Stream_GetRemainingLength(s) < 4) ++ WLog_WARN(TAG, ++ "[SERVER-BUG]: got %" PRIuz ", expected %" PRIuz ++ " bytes. [MS-RDPBCGR] 2.2.9.2.3 Frame Marker Command (TS_FRAME_MARKER) is " ++ "missing frameId, ignoring", ++ Stream_GetRemainingLength(s), 4); ++ else ++ Stream_Read_UINT32(s, marker.frameId); + WLog_Print(update->log, WLOG_DEBUG, + "SurfaceFrameMarker: action: %s (%" PRIu32 ") id: %" PRIu32 "", + (!marker.frameAction) ? "Begin" : "End", marker.frameAction, marker.frameId); +-- +2.35.1 + diff --git a/freerdp.spec b/freerdp.spec index 1ff6241..a779812 100644 --- a/freerdp.spec +++ b/freerdp.spec @@ -21,7 +21,7 @@ %endif Name: freerdp -Version: 2.5.0 +Version: 2.6.1 Release: 1%{?dist} Epoch: 2 Summary: Free implementation of the Remote Desktop Protocol (RDP) @@ -30,6 +30,10 @@ URL: http://www.freerdp.com/ Source0: https://github.com/FreeRDP/FreeRDP/archive/%{version}/FreeRDP-%{version}.tar.gz +Patch0: Added-more-log-messages-for-SurfaceCommand-failures.patch +Patch1: Implemented-4341-Default-to-network-auto.patch +Patch2: Workaround-for-MS-RDPBCGR-2.2.9.2.3-Frame-Marker-Com.patch + BuildRequires: gcc BuildRequires: gcc-c++ BuildRequires: alsa-lib-devel @@ -295,6 +299,9 @@ find %{buildroot} -name "*.a" -delete %{_libdir}/pkgconfig/winpr-tools2.pc %changelog +* Fri Mar 11 2022 Ondrej Holy - 2:2.6.1-1 +- Update to 2.6.1. + * Thu Feb 03 2022 Ondrej Holy - 2:2.5.0-1 - Update to 2.5.0. diff --git a/sources b/sources index d5e1032..65feb7e 100644 --- a/sources +++ b/sources @@ -1 +1 @@ -SHA512 (FreeRDP-2.5.0.tar.gz) = 7720306c8d0915578f6758f46ba0e0b8a81bbdcd1c80e08711576605142467f6735f644099e79a05113959fb30cd1070ca138a523537a41a7102880daf89c04c +SHA512 (FreeRDP-2.6.1.tar.gz) = 53ca93dfc09cfb49f9c434ef492a7c2f0359ecfdb28c68fcb41d5875508da45cc62e054dc134577245a3a5a63102bdb89e50aeed3090f01b578879c5d5db6dca