[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Bug#988612: marked as done (unblock: freerdp2/2.3.0+dfsg1-2)



Your message dated Mon, 17 May 2021 18:39:58 +0000
with message-id <E1lii9m-0000R9-15@respighi.debian.org>
and subject line unblock freerdp2
has caused the Debian Bug report #988612,
regarding unblock: freerdp2/2.3.0+dfsg1-2
to be marked as done.

This means that you claim that the problem has been dealt with.
If this is not the case it is now your responsibility to reopen the
Bug report if necessary, and/or fix the problem forthwith.

(NB: If you are a system administrator and have no idea what this
message is talking about, this may indicate a serious mail system
misconfiguration somewhere. Please contact owner@bugs.debian.org
immediately.)


-- 
988612: https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=988612
Debian Bug Tracking System
Contact owner@bugs.debian.org with problems
--- Begin Message ---
Package: release.debian.org
Severity: normal
User: release.debian.org@packages.debian.org
Usertags: unblock

Please unblock package freerdp2

This upload brings various stability improvements cherry-picked from
upstream (and discussed with upstream).

  * debian/watch:
    + Fix Github watch URL.

-> Enables watching of new upstream releases again.

  * debian/patches:
    + Backport changes from 2.3.2 (bound checks, API compat fixes, Smartcard
      issues fixes, etc.).
      - 0001-Added-compatibility-define.patch
      - 0003-Reverted-connectErrorCode-removal.patch
      - 0004-Fixed-a-leak-on-mouse-cursor-updates.patch
      - 0007-Fixed-format-string-in-smartcard_trace_state_return.patch
      - 0008-Fixed-linking-dependencies-for-client-geometry-chann.patch
      - 0010-Fixed-smartcard_convert_string_list-with-0-length.patch
      - 0012-Parse-on-a-copy-of-the-argument-string-for-printer.patch
      - 0015-Fix-xf_Pointer_SetPosition-with-smart-sizing.patch
      - 0017-Backported-6865-Disable-websockets-command-line-opti.patch
      - 0019-Check-smartcard_convert_string_list-for-NULL-string.patch
      - 0020-Use-specific-names-for-drive-hotplug-special-values.patch
      - 0021-Filter-RDPDR-types-other-than-drives-on-windows-hotp.patch
      - 0023-use-tlsOut-BIO-when-using-websocket-in-rdg_bio_ctrl.patch
      - 0024-Added-bounds-checks-to-gfx-commands.patch
      - 0025-Added-bounds-check-in-rdpgfx_recv_wire_to_surface_1_.patch
      - 0026-Added-fuzzying-test-for-planar-decoder.patch
      - 0027-Added-missing-bounds-check.patch
      - 0028-Fixed-mac-issues-with-smartcard-context-cleanup-6890.patch
      - 0031-Fix-monitor-list.patch
      - 0032-Fixed-CodeQL-warnings.patch
      - 0033-Reverted-winpr_BinToHexString-argument-change.patch

-> Dearly recommended changes by FreeRDP upstream. Various bounds checks, memleaks, etc.

  * debian/patches:
    + Add 0034-Fixed-6938-Remote-app-mode-clipboard-fix.patch. In remote app
      mode the _FREERDP_TIMESTAMP_PROPERTY does not work. Therefore ignore it.
    + Add 0035-Fixed-6989-Use-X509_STORE_set_default_paths.patch. Fix Windows
      10 logon when using an internal trusted root CA.

-> Two upcoming upstream stable backports (pending for FreeRDP 2.3.3).
For production setups both are a must have.

[ Reason ]
The changeset provides more stability to the FreeRDP binaries and
libraries. Clipboard in seamless RDP application are fixed, Windows
logon in corporate environments are fixes by this version.

[ Impact ]
Users of FreeRDP would be recommended to switch over to FreeRDP from
bullseye-backports (once they are available).

[ Tests ]
Manual tests against Windows 2012 Server, Windows 10 VM and Windows 2016 Server.

[ Risks ]
The chanages have also been tested with xRDP. The xRDP Server behaves well with these
changes installed on the server, also logons against xRDP work ok.

[ Checklist ]
  [x] all changes are documented in the d/changelog
  [x] I reviewed all changes and I approve them
  [x] attach debdiff against the package in testing

[ Other info ]
The changeset has been discussed with and approved by upstream FreeRPD
developers Bernhard Miklautz and  akallabeth (IRC nick, real name not
known).

unblock freerdp2/2.3.0+dfsg1-2
diff -Nru freerdp2-2.3.0+dfsg1/debian/changelog freerdp2-2.3.0+dfsg1/debian/changelog
--- freerdp2-2.3.0+dfsg1/debian/changelog	2021-02-25 16:14:52.000000000 +0100
+++ freerdp2-2.3.0+dfsg1/debian/changelog	2021-05-16 23:42:19.000000000 +0200
@@ -1,3 +1,39 @@
+freerdp2 (2.3.0+dfsg1-2) unstable; urgency=medium
+
+  * debian/watch:
+    + Fix Github watch URL.
+  * debian/patches:
+    + Backport changes from 2.3.2 (bound checks, API compat fixes, Smartcard
+      issues fixes, etc.).
+      - 0001-Added-compatibility-define.patch
+      - 0003-Reverted-connectErrorCode-removal.patch
+      - 0004-Fixed-a-leak-on-mouse-cursor-updates.patch
+      - 0007-Fixed-format-string-in-smartcard_trace_state_return.patch
+      - 0008-Fixed-linking-dependencies-for-client-geometry-chann.patch
+      - 0010-Fixed-smartcard_convert_string_list-with-0-length.patch
+      - 0012-Parse-on-a-copy-of-the-argument-string-for-printer.patch
+      - 0015-Fix-xf_Pointer_SetPosition-with-smart-sizing.patch
+      - 0017-Backported-6865-Disable-websockets-command-line-opti.patch
+      - 0019-Check-smartcard_convert_string_list-for-NULL-string.patch
+      - 0020-Use-specific-names-for-drive-hotplug-special-values.patch
+      - 0021-Filter-RDPDR-types-other-than-drives-on-windows-hotp.patch
+      - 0023-use-tlsOut-BIO-when-using-websocket-in-rdg_bio_ctrl.patch
+      - 0024-Added-bounds-checks-to-gfx-commands.patch
+      - 0025-Added-bounds-check-in-rdpgfx_recv_wire_to_surface_1_.patch
+      - 0026-Added-fuzzying-test-for-planar-decoder.patch
+      - 0027-Added-missing-bounds-check.patch
+      - 0028-Fixed-mac-issues-with-smartcard-context-cleanup-6890.patch
+      - 0031-Fix-monitor-list.patch
+      - 0032-Fixed-CodeQL-warnings.patch
+      - 0033-Reverted-winpr_BinToHexString-argument-change.patch
+  * debian/patches:
+    + Add 0034-Fixed-6938-Remote-app-mode-clipboard-fix.patch. In remote app
+      mode the _FREERDP_TIMESTAMP_PROPERTY does not work. Therefore ignore it.
+    + Add 0035-Fixed-6989-Use-X509_STORE_set_default_paths.patch. Fix Windows
+      10 logon when using an internal trusted root CA.
+
+ -- Mike Gabriel <sunweaver@debian.org>  Sun, 16 May 2021 23:42:19 +0200
+
 freerdp2 (2.3.0+dfsg1-1) unstable; urgency=medium
 
   [ Fabio Fantoni ]
diff -Nru freerdp2-2.3.0+dfsg1/debian/patches/0001-Added-compatibility-define.patch freerdp2-2.3.0+dfsg1/debian/patches/0001-Added-compatibility-define.patch
--- freerdp2-2.3.0+dfsg1/debian/patches/0001-Added-compatibility-define.patch	1970-01-01 01:00:00.000000000 +0100
+++ freerdp2-2.3.0+dfsg1/debian/patches/0001-Added-compatibility-define.patch	2021-04-29 11:57:14.000000000 +0200
@@ -0,0 +1,24 @@
+From 1ff1906545bacb3eb7608155984dd4642647b736 Mon Sep 17 00:00:00 2001
+From: akallabeth <akallabeth@posteo.net>
+Date: Sat, 27 Feb 2021 08:29:46 +0100
+Subject: [PATCH 01/36] Added compatibility define
+
+---
+ winpr/include/winpr/shell.h | 1 +
+ 1 file changed, 1 insertion(+)
+
+diff --git a/winpr/include/winpr/shell.h b/winpr/include/winpr/shell.h
+index 72931a01b..f88291e43 100644
+--- a/winpr/include/winpr/shell.h
++++ b/winpr/include/winpr/shell.h
+@@ -86,6 +86,7 @@ typedef enum
+ 
+ /* Deprecated, here for compatibility */
+ #define FD_SHOWPROGRESSUI FD_PROGRESSUI
++#define FD_WRITESTIME FD_WRITETIME
+ 
+ /* FILEDESCRIPTOR.dwFileAttributes */
+ #define FILE_ATTRIBUTE_READONLY 0x00000001
+-- 
+2.30.2
+
diff -Nru freerdp2-2.3.0+dfsg1/debian/patches/0003-Reverted-connectErrorCode-removal.patch freerdp2-2.3.0+dfsg1/debian/patches/0003-Reverted-connectErrorCode-removal.patch
--- freerdp2-2.3.0+dfsg1/debian/patches/0003-Reverted-connectErrorCode-removal.patch	1970-01-01 01:00:00.000000000 +0100
+++ freerdp2-2.3.0+dfsg1/debian/patches/0003-Reverted-connectErrorCode-removal.patch	2021-04-29 11:55:48.000000000 +0200
@@ -0,0 +1,149 @@
+From 73753f8af40de20703858fff37a762b7f5580bb0 Mon Sep 17 00:00:00 2001
+From: akallabeth <akallabeth@posteo.net>
+Date: Sat, 27 Feb 2021 08:35:33 +0100
+Subject: [PATCH 03/36] Reverted connectErrorCode removal
+
+Reverted changes from e4b30a5cb6100a8ea4f320b829c9c5712ed4a783
+removing the symbol/define, keep the changes for the clients.
+Mark as deprecated
+---
+ include/freerdp/error.h   | 25 +++++++++++++++++
+ libfreerdp/core/errinfo.c |  2 ++
+ libfreerdp/core/freerdp.c | 58 +++++++++++++++++++++++++++++++++++++++
+ 3 files changed, 85 insertions(+)
+
+diff --git a/include/freerdp/error.h b/include/freerdp/error.h
+index 0fb51608b..a928a645a 100644
+--- a/include/freerdp/error.h
++++ b/include/freerdp/error.h
+@@ -177,6 +177,31 @@ extern "C"
+ 	FREERDP_API const char* freerdp_get_error_info_name(UINT32 code);
+ 	FREERDP_API const char* freerdp_get_error_info_category(UINT32 code);
+ 
++	/**
++	 * DEPRECATED!
++	 * This static variable holds an error code if the return value from connect is FALSE.
++	 * This variable is always set to 0 in the beginning of the connect sequence.
++	 * The returned code can be used to inform the user of the detailed connect error.
++	 * The value can hold one of the defined error codes below OR an error according to errno
++	 */
++
++	FREERDP_API extern int connectErrorCode;
++
++#define ERRORSTART 10000
++#define PREECONNECTERROR ERRORSTART + 1
++#define UNDEFINEDCONNECTERROR ERRORSTART + 2
++#define POSTCONNECTERROR ERRORSTART + 3
++#define DNSERROR ERRORSTART + 4        /* general DNS ERROR */
++#define DNSNAMENOTFOUND ERRORSTART + 5 /* EAI_NONAME */
++#define CONNECTERROR                                                            \
++	ERRORSTART + 6 /* a connect error if errno is not define during tcp connect \
++	                */
++#define MCSCONNECTINITIALERROR ERRORSTART + 7
++#define TLSCONNECTERROR ERRORSTART + 8
++#define AUTHENTICATIONERROR ERRORSTART + 9
++#define INSUFFICIENTPRIVILEGESERROR ERRORSTART + 10
++#define CANCELEDBYUSER ERRORSTART + 11
++
+ 	/**
+ 	 * FreeRDP Context Error Codes
+ 	 */
+diff --git a/libfreerdp/core/errinfo.c b/libfreerdp/core/errinfo.c
+index abfe96efd..e635847dc 100644
+--- a/libfreerdp/core/errinfo.c
++++ b/libfreerdp/core/errinfo.c
+@@ -34,6 +34,8 @@
+ 		ERRINFO_##_code, "ERRINFO_" #_code, ERRINFO_##_code##_STRING, category \
+ 	}
+ 
++int connectErrorCode;
++
+ /* Protocol-independent codes */
+ 
+ #define ERRINFO_RPC_INITIATED_DISCONNECT_STRING \
+diff --git a/libfreerdp/core/freerdp.c b/libfreerdp/core/freerdp.c
+index 81183e76d..9094bc346 100644
+--- a/libfreerdp/core/freerdp.c
++++ b/libfreerdp/core/freerdp.c
+@@ -55,6 +55,8 @@
+ 
+ #define TAG FREERDP_TAG("core")
+ 
++/* connectErrorCode is 'extern' in error.h. See comment there.*/
++
+ UINT freerdp_channel_add_init_handle_data(rdpChannelHandles* handles, void* pInitHandle,
+                                           void* pUserData)
+ {
+@@ -161,6 +163,7 @@ BOOL freerdp_connect(freerdp* instance)
+ 
+ 	/* We always set the return code to 0 before we start the connect sequence*/
+ 	instance->ConnectionCallbackState = CLIENT_STATE_INITIAL;
++	connectErrorCode = 0;
+ 	freerdp_set_last_error_log(instance->context, FREERDP_ERROR_SUCCESS);
+ 	clearChannelError(instance->context);
+ 	ResetEvent(instance->context->abortEvent);
+@@ -890,6 +893,61 @@ void freerdp_set_last_error_ex(rdpContext* context, UINT32 lastError, const char
+ 	}
+ 
+ 	context->LastError = lastError;
++
++	switch (lastError)
++	{
++		case FREERDP_ERROR_PRE_CONNECT_FAILED:
++			connectErrorCode = PREECONNECTERROR;
++			break;
++
++		case FREERDP_ERROR_CONNECT_UNDEFINED:
++			connectErrorCode = UNDEFINEDCONNECTERROR;
++			break;
++
++		case FREERDP_ERROR_POST_CONNECT_FAILED:
++			connectErrorCode = POSTCONNECTERROR;
++			break;
++
++		case FREERDP_ERROR_DNS_ERROR:
++			connectErrorCode = DNSERROR;
++			break;
++
++		case FREERDP_ERROR_DNS_NAME_NOT_FOUND:
++			connectErrorCode = DNSNAMENOTFOUND;
++			break;
++
++		case FREERDP_ERROR_CONNECT_FAILED:
++			connectErrorCode = CONNECTERROR;
++			break;
++
++		case FREERDP_ERROR_MCS_CONNECT_INITIAL_ERROR:
++			connectErrorCode = MCSCONNECTINITIALERROR;
++			break;
++
++		case FREERDP_ERROR_TLS_CONNECT_FAILED:
++			connectErrorCode = TLSCONNECTERROR;
++			break;
++
++		case FREERDP_ERROR_AUTHENTICATION_FAILED:
++			connectErrorCode = AUTHENTICATIONERROR;
++			break;
++
++		case FREERDP_ERROR_INSUFFICIENT_PRIVILEGES:
++			connectErrorCode = INSUFFICIENTPRIVILEGESERROR;
++			break;
++
++		case FREERDP_ERROR_CONNECT_CANCELLED:
++			connectErrorCode = CANCELEDBYUSER;
++			break;
++
++		case FREERDP_ERROR_SECURITY_NEGO_CONNECT_FAILED:
++			connectErrorCode = CONNECTERROR;
++			break;
++
++		case FREERDP_ERROR_CONNECT_TRANSPORT_FAILED:
++			connectErrorCode = CONNECTERROR;
++			break;
++	}
+ }
+ 
+ const char* freerdp_get_logon_error_info_type(UINT32 type)
+-- 
+2.30.2
+
diff -Nru freerdp2-2.3.0+dfsg1/debian/patches/0004-Fixed-a-leak-on-mouse-cursor-updates.patch freerdp2-2.3.0+dfsg1/debian/patches/0004-Fixed-a-leak-on-mouse-cursor-updates.patch
--- freerdp2-2.3.0+dfsg1/debian/patches/0004-Fixed-a-leak-on-mouse-cursor-updates.patch	1970-01-01 01:00:00.000000000 +0100
+++ freerdp2-2.3.0+dfsg1/debian/patches/0004-Fixed-a-leak-on-mouse-cursor-updates.patch	2021-04-29 11:55:48.000000000 +0200
@@ -0,0 +1,37 @@
+From d88480fc48d9599a8d46e255e13ed9dbb89defde Mon Sep 17 00:00:00 2001
+From: akallabeth <akallabeth@posteo.net>
+Date: Sat, 27 Feb 2021 17:37:35 +0100
+Subject: [PATCH 04/36] Fixed a leak on mouse cursor updates
+
+---
+ client/X11/xf_graphics.c | 12 ++++++------
+ 1 file changed, 6 insertions(+), 6 deletions(-)
+
+diff --git a/client/X11/xf_graphics.c b/client/X11/xf_graphics.c
+index 20d54f50c..54a4b9cc7 100644
+--- a/client/X11/xf_graphics.c
++++ b/client/X11/xf_graphics.c
+@@ -305,14 +305,14 @@ static BOOL _xf_Pointer_GetCursorForCurrentScale(rdpContext* context, const rdpP
+ 		ci.yhot = pointer->yPos * yscale;
+ 		size = ci.height * ci.width * GetBytesPerPixel(CursorFormat);
+ 
+-		if (!(ci.pixels = (XcursorPixel*)_aligned_malloc(size, 16)))
+-		{
+-			xf_unlock_x11(xfc);
+-			return FALSE;
+-		}
+-
+ 		if (xscale != 1 || yscale != 1)
+ 		{
++			if (!(ci.pixels = (XcursorPixel*)_aligned_malloc(size, 16)))
++			{
++				xf_unlock_x11(xfc);
++				return FALSE;
++			}
++
+ 			if (!freerdp_image_scale((BYTE*)ci.pixels, CursorFormat, 0, 0, 0, ci.width, ci.height,
+ 			                         (BYTE*)xpointer->cursorPixels, CursorFormat, 0, 0, 0,
+ 			                         pointer->width, pointer->height))
+-- 
+2.30.2
+
diff -Nru freerdp2-2.3.0+dfsg1/debian/patches/0007-Fixed-format-string-in-smartcard_trace_state_return.patch freerdp2-2.3.0+dfsg1/debian/patches/0007-Fixed-format-string-in-smartcard_trace_state_return.patch
--- freerdp2-2.3.0+dfsg1/debian/patches/0007-Fixed-format-string-in-smartcard_trace_state_return.patch	1970-01-01 01:00:00.000000000 +0100
+++ freerdp2-2.3.0+dfsg1/debian/patches/0007-Fixed-format-string-in-smartcard_trace_state_return.patch	2021-04-29 11:55:48.000000000 +0200
@@ -0,0 +1,46 @@
+From 69ff618ebc142b53062115fab1547eb5ff2c25d7 Mon Sep 17 00:00:00 2001
+From: akallabeth <akallabeth@posteo.net>
+Date: Tue, 2 Mar 2021 07:50:17 +0100
+Subject: [PATCH 07/36] Fixed format string in smartcard_trace_state_return
+
+(cherry picked from commit ca96c4450707d39dbd5c94f2b1c4ae807789b012)
+---
+ channels/smartcard/client/smartcard_pack.c | 11 +++++++----
+ 1 file changed, 7 insertions(+), 4 deletions(-)
+
+diff --git a/channels/smartcard/client/smartcard_pack.c b/channels/smartcard/client/smartcard_pack.c
+index f5987d4b5..ed0301bb2 100644
+--- a/channels/smartcard/client/smartcard_pack.c
++++ b/channels/smartcard/client/smartcard_pack.c
+@@ -1307,21 +1307,24 @@ static void smartcard_trace_status_return(SMARTCARD_DEVICE* smartcard, const Sta
+ static void smartcard_trace_state_return(SMARTCARD_DEVICE* smartcard, const State_Return* ret)
+ {
+ 	char buffer[1024];
+-
++	char* state;
+ 	WINPR_UNUSED(smartcard);
+ 
+ 	if (!WLog_IsLevelActive(WLog_Get(TAG), g_LogLevel))
+ 		return;
+ 
++	state = SCardGetReaderStateString(ret->dwState);
+ 	WLog_LVL(TAG, g_LogLevel, "Reconnect_Return {");
+ 	WLog_LVL(TAG, g_LogLevel, "  ReturnCode: %s (0x%08" PRIX32 ")",
+ 	         SCardGetErrorString(ret->ReturnCode), ret->ReturnCode);
+-	WLog_LVL(TAG, g_LogLevel, "  dwState:    %s (0x%08" PRIX32 ")", ret->dwState);
+-	WLog_LVL(TAG, g_LogLevel, "  dwProtocol: %s (0x%08" PRIX32 ")", ret->dwProtocol);
+-	WLog_LVL(TAG, g_LogLevel, "  cbAtrLen:   %s (0x%08" PRIX32 ")", ret->cbAtrLen);
++	WLog_LVL(TAG, g_LogLevel, "  dwState:    %s (0x%08" PRIX32 ")", state, ret->dwState);
++	WLog_LVL(TAG, g_LogLevel, "  dwProtocol: %s (0x%08" PRIX32 ")",
++	         SCardGetProtocolString(ret->dwProtocol), ret->dwProtocol);
++	WLog_LVL(TAG, g_LogLevel, "  cbAtrLen:      (0x%08" PRIX32 ")", ret->cbAtrLen);
+ 	WLog_LVL(TAG, g_LogLevel, "  rgAtr:      %s",
+ 	         smartcard_array_dump(ret->rgAtr, sizeof(ret->rgAtr), buffer, sizeof(buffer)));
+ 	WLog_LVL(TAG, g_LogLevel, "}");
++	free(state);
+ }
+ 
+ static void smartcard_trace_reconnect_return(SMARTCARD_DEVICE* smartcard,
+-- 
+2.30.2
+
diff -Nru freerdp2-2.3.0+dfsg1/debian/patches/0008-Fixed-linking-dependencies-for-client-geometry-chann.patch freerdp2-2.3.0+dfsg1/debian/patches/0008-Fixed-linking-dependencies-for-client-geometry-chann.patch
--- freerdp2-2.3.0+dfsg1/debian/patches/0008-Fixed-linking-dependencies-for-client-geometry-chann.patch	1970-01-01 01:00:00.000000000 +0100
+++ freerdp2-2.3.0+dfsg1/debian/patches/0008-Fixed-linking-dependencies-for-client-geometry-chann.patch	2021-04-29 11:55:48.000000000 +0200
@@ -0,0 +1,30 @@
+From de743a836a982807cbb88efdebb66c09eea010f2 Mon Sep 17 00:00:00 2001
+From: akallabeth <akallabeth@posteo.net>
+Date: Tue, 1 Dec 2020 11:44:14 +0100
+Subject: [PATCH 08/36] Fixed linking dependencies for client geometry channel
+
+(cherry picked from commit 7056433c8ecd045912fecb896ffa2eac3aad1410)
+---
+ channels/geometry/client/CMakeLists.txt | 5 +++--
+ 1 file changed, 3 insertions(+), 2 deletions(-)
+
+diff --git a/channels/geometry/client/CMakeLists.txt b/channels/geometry/client/CMakeLists.txt
+index ea28bff9d..ac9fdc407 100644
+--- a/channels/geometry/client/CMakeLists.txt
++++ b/channels/geometry/client/CMakeLists.txt
+@@ -25,9 +25,10 @@ include_directories(..)
+ 
+ add_channel_client_library(${MODULE_PREFIX} ${MODULE_NAME} ${CHANNEL_NAME} TRUE "DVCPluginEntry")
+ 
+-
+-
+ set(${MODULE_PREFIX}_LIBS ${${MODULE_PREFIX}_LIBS} winpr)
++if (NOT BUILTIN_CHANNELS OR NOT BUILD_SHARED_LIBS)
++    set(${MODULE_PREFIX}_LIBS ${${MODULE_PREFIX}_LIBS} freerdp-client)
++endif()
+ 
+ target_link_libraries(${MODULE_NAME} ${${MODULE_PREFIX}_LIBS})
+ 
+-- 
+2.30.2
+
diff -Nru freerdp2-2.3.0+dfsg1/debian/patches/0010-Fixed-smartcard_convert_string_list-with-0-length.patch freerdp2-2.3.0+dfsg1/debian/patches/0010-Fixed-smartcard_convert_string_list-with-0-length.patch
--- freerdp2-2.3.0+dfsg1/debian/patches/0010-Fixed-smartcard_convert_string_list-with-0-length.patch	1970-01-01 01:00:00.000000000 +0100
+++ freerdp2-2.3.0+dfsg1/debian/patches/0010-Fixed-smartcard_convert_string_list-with-0-length.patch	2021-04-29 11:55:48.000000000 +0200
@@ -0,0 +1,45 @@
+From 471cda7ef304afb27c2fd1aa5a59078c7401e46e Mon Sep 17 00:00:00 2001
+From: Armin Novak <armin.novak@thincast.com>
+Date: Wed, 3 Mar 2021 11:39:55 +0100
+Subject: [PATCH 10/36] Fixed smartcard_convert_string_list with 0 length
+
+(cherry picked from commit e9904e286f43dea5940182b25740730c55e7c8a6)
+---
+ channels/smartcard/client/smartcard_pack.c | 12 ++++++++----
+ 1 file changed, 8 insertions(+), 4 deletions(-)
+
+diff --git a/channels/smartcard/client/smartcard_pack.c b/channels/smartcard/client/smartcard_pack.c
+index ed0301bb2..83c9d3023 100644
+--- a/channels/smartcard/client/smartcard_pack.c
++++ b/channels/smartcard/client/smartcard_pack.c
+@@ -351,8 +351,11 @@ static char* smartcard_convert_string_list(const void* in, size_t bytes, BOOL un
+ 
+ 	if (unicode)
+ 	{
+-		length = (bytes / 2);
+-		if (ConvertFromUnicode(CP_UTF8, 0, string.wz, (int)length, &mszA, 0, NULL, NULL) !=
++		length = (bytes / sizeof(WCHAR)) - 1;
++		mszA = (char*)calloc(length + 1, sizeof(WCHAR));
++		if (!mszA)
++			return NULL;
++		if (ConvertFromUnicode(CP_UTF8, 0, string.wz, (int)length, &mszA, length + 1, NULL, NULL) !=
+ 		    (int)length)
+ 		{
+ 			free(mszA);
+@@ -362,10 +365,11 @@ static char* smartcard_convert_string_list(const void* in, size_t bytes, BOOL un
+ 	else
+ 	{
+ 		length = bytes;
+-		mszA = (char*)malloc(length);
++		mszA = (char*)calloc(length, sizeof(char));
+ 		if (!mszA)
+ 			return NULL;
+-		CopyMemory(mszA, string.sz, length);
++		CopyMemory(mszA, string.sz, length - 1);
++		mszA[length - 1] = '\0';
+ 	}
+ 
+ 	for (index = 0; index < length - 1; index++)
+-- 
+2.30.2
+
diff -Nru freerdp2-2.3.0+dfsg1/debian/patches/0012-Parse-on-a-copy-of-the-argument-string-for-printer.patch freerdp2-2.3.0+dfsg1/debian/patches/0012-Parse-on-a-copy-of-the-argument-string-for-printer.patch
--- freerdp2-2.3.0+dfsg1/debian/patches/0012-Parse-on-a-copy-of-the-argument-string-for-printer.patch	1970-01-01 01:00:00.000000000 +0100
+++ freerdp2-2.3.0+dfsg1/debian/patches/0012-Parse-on-a-copy-of-the-argument-string-for-printer.patch	2021-04-29 11:55:48.000000000 +0200
@@ -0,0 +1,49 @@
+From 9ce4bc351f188ee52786c6f3a6b4ee1b48926bfd Mon Sep 17 00:00:00 2001
+From: akallabeth <akallabeth@posteo.net>
+Date: Thu, 4 Mar 2021 14:26:35 +0100
+Subject: [PATCH 12/36] Parse on a copy of the argument string for printer
+
+If done on original the wrong backend is loaded on autoreconnect
+
+(cherry picked from commit af1c6ebcb49c93d636817ec98f74d07cba9d7f26)
+---
+ channels/printer/client/printer_main.c | 9 ++++++---
+ 1 file changed, 6 insertions(+), 3 deletions(-)
+
+diff --git a/channels/printer/client/printer_main.c b/channels/printer/client/printer_main.c
+index dbcc07dc5..170ecb15b 100644
+--- a/channels/printer/client/printer_main.c
++++ b/channels/printer/client/printer_main.c
+@@ -979,7 +979,7 @@ printer_DeviceServiceEntry
+ 
+ 	device = (RDPDR_PRINTER*)pEntryPoints->device;
+ 	name = device->Name;
+-	driver_name = device->DriverName;
++	driver_name = _strdup(device->DriverName);
+ 
+ 	/* Secondary argument is one of the following:
+ 	 *
+@@ -1016,7 +1016,8 @@ printer_DeviceServiceEntry
+ 	if (!driver)
+ 	{
+ 		WLog_ERR(TAG, "Could not get a printer driver!");
+-		return CHANNEL_RC_INITIALIZATION_ERROR;
++		error = CHANNEL_RC_INITIALIZATION_ERROR;
++		goto fail;
+ 	}
+ 
+ 	if (name && name[0])
+@@ -1064,7 +1065,9 @@ printer_DeviceServiceEntry
+ 	}
+ 
+ fail:
+-	driver->ReleaseRef(driver);
++	free(driver_name);
++	if (driver)
++		driver->ReleaseRef(driver);
+ 
+ 	return error;
+ }
+-- 
+2.30.2
+
diff -Nru freerdp2-2.3.0+dfsg1/debian/patches/0015-Fix-xf_Pointer_SetPosition-with-smart-sizing.patch freerdp2-2.3.0+dfsg1/debian/patches/0015-Fix-xf_Pointer_SetPosition-with-smart-sizing.patch
--- freerdp2-2.3.0+dfsg1/debian/patches/0015-Fix-xf_Pointer_SetPosition-with-smart-sizing.patch	1970-01-01 01:00:00.000000000 +0100
+++ freerdp2-2.3.0+dfsg1/debian/patches/0015-Fix-xf_Pointer_SetPosition-with-smart-sizing.patch	2021-04-29 11:55:48.000000000 +0200
@@ -0,0 +1,99 @@
+From 899be1b564ac4f4803de5b81e0711821403d9ed1 Mon Sep 17 00:00:00 2001
+From: akallabeth <akallabeth@posteo.net>
+Date: Mon, 8 Mar 2021 13:52:29 +0100
+Subject: [PATCH 15/36] Fix xf_Pointer_SetPosition with smart-sizing
+
+(cherry picked from commit d3e3ab7b5d5ce376ba72fa1fc0aee2f25c9682b4)
+---
+ client/X11/xf_event.c    | 31 +++++++++++++++++++++++++++++++
+ client/X11/xf_event.h    |  1 +
+ client/X11/xf_graphics.c |  5 ++++-
+ 3 files changed, 36 insertions(+), 1 deletion(-)
+
+diff --git a/client/X11/xf_event.c b/client/X11/xf_event.c
+index 60fe9c6b3..99577b1a1 100644
+--- a/client/X11/xf_event.c
++++ b/client/X11/xf_event.c
+@@ -262,6 +262,37 @@ static BOOL xf_event_execute_action_script(xfContext* xfc, const XEvent* event)
+ 	return TRUE;
+ }
+ 
++void xf_adjust_coordinates_to_screen(xfContext* xfc, UINT32* x, UINT32* y)
++{
++	rdpSettings* settings;
++	INT64 tx, ty;
++
++	if (!xfc || !xfc->context.settings || !y || !x)
++		return;
++
++	settings = xfc->context.settings;
++	tx = *x;
++	ty = *y;
++	if (!xfc->remote_app)
++	{
++#ifdef WITH_XRENDER
++
++		if (xf_picture_transform_required(xfc))
++		{
++			double xScalingFactor = xfc->scaledWidth / (double)settings->DesktopWidth;
++			double yScalingFactor = xfc->scaledHeight / (double)settings->DesktopHeight;
++			tx = ((tx + xfc->offset_x) * xScalingFactor);
++			ty = ((ty + xfc->offset_y) * yScalingFactor);
++		}
++
++#endif
++	}
++
++	CLAMP_COORDINATES(tx, ty);
++	*x = tx;
++	*y = ty;
++}
++
+ void xf_event_adjust_coordinates(xfContext* xfc, int* x, int* y)
+ {
+ 	rdpSettings* settings;
+diff --git a/client/X11/xf_event.h b/client/X11/xf_event.h
+index 185c83c7c..2269d3eea 100644
+--- a/client/X11/xf_event.h
++++ b/client/X11/xf_event.h
+@@ -33,6 +33,7 @@ void xf_event_SendClientEvent(xfContext* xfc, xfWindow* window, Atom atom, unsig
+                               ...);
+ 
+ void xf_event_adjust_coordinates(xfContext* xfc, int* x, int* y);
++void xf_adjust_coordinates_to_screen(xfContext* xfc, UINT32* x, UINT32* y);
+ 
+ BOOL xf_generic_MotionNotify(xfContext* xfc, int x, int y, int state, Window window, BOOL app);
+ BOOL xf_generic_ButtonPress(xfContext* xfc, int x, int y, int button, Window window, BOOL app);
+diff --git a/client/X11/xf_graphics.c b/client/X11/xf_graphics.c
+index 54a4b9cc7..1700092f8 100644
+--- a/client/X11/xf_graphics.c
++++ b/client/X11/xf_graphics.c
+@@ -37,6 +37,7 @@
+ 
+ #include "xf_graphics.h"
+ #include "xf_gdi.h"
++#include "xf_event.h"
+ 
+ #include <freerdp/log.h>
+ #define TAG CLIENT_TAG("x11")
+@@ -521,6 +522,8 @@ static BOOL xf_Pointer_SetPosition(rdpContext* context, UINT32 x, UINT32 y)
+ 	if (xfc->remote_app && !xfc->focused)
+ 		return TRUE;
+ 
++	xf_adjust_coordinates_to_screen(xfc, &x, &y);
++
+ 	xf_lock_x11(xfc);
+ 
+ 	rc = XGetWindowAttributes(xfc->display, handle, &current);
+@@ -541,7 +544,7 @@ static BOOL xf_Pointer_SetPosition(rdpContext* context, UINT32 x, UINT32 y)
+ 
+ 	rc = XWarpPointer(xfc->display, None, handle, 0, 0, 0, 0, x, y);
+ 	if (rc == 0)
+-		WLog_WARN(TAG, "xf_Pointer_SetPosition: XWrapPointer==%d", rc);
++		WLog_WARN(TAG, "xf_Pointer_SetPosition: XWarpPointer==%d", rc);
+ 	tmp.event_mask = current.your_event_mask;
+ 	rc = XChangeWindowAttributes(xfc->display, handle, CWEventMask, &tmp);
+ 	if (rc == 0)
+-- 
+2.30.2
+
diff -Nru freerdp2-2.3.0+dfsg1/debian/patches/0017-Backported-6865-Disable-websockets-command-line-opti.patch freerdp2-2.3.0+dfsg1/debian/patches/0017-Backported-6865-Disable-websockets-command-line-opti.patch
--- freerdp2-2.3.0+dfsg1/debian/patches/0017-Backported-6865-Disable-websockets-command-line-opti.patch	1970-01-01 01:00:00.000000000 +0100
+++ freerdp2-2.3.0+dfsg1/debian/patches/0017-Backported-6865-Disable-websockets-command-line-opti.patch	2021-04-29 12:04:00.000000000 +0200
@@ -0,0 +1,145 @@
+From f4c87729e393c4f9f522d2731078655f469d9b12 Mon Sep 17 00:00:00 2001
+From: akallabeth <akallabeth@posteo.net>
+Date: Mon, 8 Mar 2021 14:31:17 +0100
+Subject: [PATCH 17/36] Backported #6865: Disable websockets command line
+ option
+
+---
+ client/common/cmdline.c                       | 30 ++++++++++++++-----
+ client/common/cmdline.h                       |  4 +--
+ include/freerdp/settings.h                    |  4 ++-
+ libfreerdp/common/settings_getters.c          |  7 +++++
+ libfreerdp/common/settings_str.c              |  1 +
+ libfreerdp/core/gateway/rdg.c                 |  4 ++-
+ .../core/test/settings_property_lists.h       |  1 +
+ 7 files changed, 39 insertions(+), 12 deletions(-)
+
+--- a/client/common/cmdline.c
++++ b/client/common/cmdline.c
+@@ -2234,15 +2234,29 @@
+ 				settings->GatewayRpcTransport = TRUE;
+ 				settings->GatewayHttpTransport = FALSE;
+ 			}
+-			else if (_stricmp(arg->Value, "http") == 0)
++			else
+ 			{
+-				settings->GatewayRpcTransport = FALSE;
+-				settings->GatewayHttpTransport = TRUE;
+-			}
+-			else if (_stricmp(arg->Value, "auto") == 0)
+-			{
+-				settings->GatewayRpcTransport = TRUE;
+-				settings->GatewayHttpTransport = TRUE;
++				char* c = strchr(arg->Value, ',');
++				if (c)
++				{
++					*c++ = '\0';
++					if (_stricmp(c, "no-websockets") != 0)
++					{
++						return COMMAND_LINE_ERROR_UNEXPECTED_VALUE;
++					}
++					freerdp_settings_set_bool(settings, FreeRDP_GatewayHttpUseWebsockets, FALSE);
++				}
++
++				if (_stricmp(arg->Value, "http") == 0)
++				{
++					settings->GatewayRpcTransport = FALSE;
++					settings->GatewayHttpTransport = TRUE;
++				}
++				else if (_stricmp(arg->Value, "auto") == 0)
++				{
++					settings->GatewayRpcTransport = TRUE;
++					settings->GatewayHttpTransport = TRUE;
++				}
+ 			}
+ 		}
+ 		CommandLineSwitchCase(arg, "gat")
+--- a/client/common/cmdline.h
++++ b/client/common/cmdline.h
+@@ -180,8 +180,8 @@
+ 	{ "gp", COMMAND_LINE_VALUE_REQUIRED, "<password>", NULL, NULL, -1, NULL, "Gateway password" },
+ 	{ "grab-keyboard", COMMAND_LINE_VALUE_BOOL, NULL, BoolValueTrue, NULL, -1, NULL,
+ 	  "Grab keyboard" },
+-	{ "gt", COMMAND_LINE_VALUE_REQUIRED, "[rpc|http|auto]", NULL, NULL, -1, NULL,
+-	  "Gateway transport type" },
++	{ "gt", COMMAND_LINE_VALUE_REQUIRED, "[rpc|http[,no-websockets]|auto[,no-websockets]]", NULL,
++	  NULL, -1, NULL, "Gateway transport type" },
+ 	{ "gu", COMMAND_LINE_VALUE_REQUIRED, "[[<domain>\\]<user>|<user>[@<domain>]]", NULL, NULL, -1,
+ 	  NULL, "Gateway username" },
+ 	{ "gat", COMMAND_LINE_VALUE_REQUIRED, "<access token>", NULL, NULL, -1, NULL,
+--- a/include/freerdp/settings.h
++++ b/include/freerdp/settings.h
+@@ -751,6 +751,7 @@
+ #define FreeRDP_GatewayAccessToken (1997)
+ #define FreeRDP_GatewayAcceptedCert (1998)
+ #define FreeRDP_GatewayAcceptedCertLength (1999)
++#define FreeRDP_GatewayHttpUseWebsockets (2000)
+ #define FreeRDP_ProxyType (2015)
+ #define FreeRDP_ProxyHostname (2016)
+ #define FreeRDP_ProxyPort (2017)
+@@ -1252,7 +1253,8 @@
+ 	ALIGN64 char* GatewayAccessToken;         /* 1997 */
+ 	ALIGN64 char* GatewayAcceptedCert;        /* 1998 */
+ 	ALIGN64 UINT32 GatewayAcceptedCertLength; /* 1999 */
+-	UINT64 padding2015[2015 - 2000];          /* 2000 */
++	ALIGN64 BOOL GatewayHttpUseWebsockets;    /* 2000 */
++	UINT64 padding2015[2015 - 2001];          /* 2001 */
+ 
+ 	/* Proxy */
+ 	ALIGN64 UINT32 ProxyType;        /* 2015 */
+--- a/libfreerdp/common/settings_getters.c
++++ b/libfreerdp/common/settings_getters.c
+@@ -192,6 +192,9 @@
+ 		case FreeRDP_GatewayHttpTransport:
+ 			return settings->GatewayHttpTransport;
+ 
++		case FreeRDP_GatewayHttpUseWebsockets:
++			return settings->GatewayHttpUseWebsockets;
++
+ 		case FreeRDP_GatewayRpcTransport:
+ 			return settings->GatewayRpcTransport;
+ 
+@@ -754,6 +757,10 @@
+ 			settings->GatewayHttpTransport = val;
+ 			break;
+ 
++		case FreeRDP_GatewayHttpUseWebsockets:
++			settings->GatewayHttpUseWebsockets = val;
++			break;
++
+ 		case FreeRDP_GatewayRpcTransport:
+ 			settings->GatewayRpcTransport = val;
+ 			break;
+--- a/libfreerdp/common/settings_str.c
++++ b/libfreerdp/common/settings_str.c
+@@ -74,6 +74,7 @@
+ 	{ FreeRDP_GatewayBypassLocal, 0, "FreeRDP_GatewayBypassLocal" },
+ 	{ FreeRDP_GatewayEnabled, 0, "FreeRDP_GatewayEnabled" },
+ 	{ FreeRDP_GatewayHttpTransport, 0, "FreeRDP_GatewayHttpTransport" },
++	{ FreeRDP_GatewayHttpUseWebsockets, 0, "FreeRDP_GatewayHttpUseWebsockets" },
+ 	{ FreeRDP_GatewayRpcTransport, 0, "FreeRDP_GatewayRpcTransport" },
+ 	{ FreeRDP_GatewayUdpTransport, 0, "FreeRDP_GatewayUdpTransport" },
+ 	{ FreeRDP_GatewayUseSameCredentials, 0, "FreeRDP_GatewayUseSameCredentials" },
+--- a/libfreerdp/core/gateway/rdg.c
++++ b/libfreerdp/core/gateway/rdg.c
+@@ -2547,7 +2547,9 @@
+ 		    !http_context_set_user_agent(rdg->http, "MS-RDGateway/1.0") ||
+ 		    !http_context_set_host(rdg->http, rdg->settings->GatewayHostname) ||
+ 		    !http_context_set_rdg_connection_id(rdg->http, bracedUuid) ||
+-		    !http_context_enable_websocket_upgrade(rdg->http, TRUE))
++		    !http_context_enable_websocket_upgrade(
++		        rdg->http,
++		        freerdp_settings_get_bool(rdg->settings, FreeRDP_GatewayHttpUseWebsockets)))
+ 		{
+ 			goto rdg_alloc_error;
+ 		}
+--- a/libfreerdp/core/test/settings_property_lists.h
++++ b/libfreerdp/core/test/settings_property_lists.h
+@@ -63,6 +63,7 @@
+ 	FreeRDP_GatewayBypassLocal,
+ 	FreeRDP_GatewayEnabled,
+ 	FreeRDP_GatewayHttpTransport,
++	FreeRDP_GatewayHttpUseWebsockets,
+ 	FreeRDP_GatewayRpcTransport,
+ 	FreeRDP_GatewayUdpTransport,
+ 	FreeRDP_GatewayUseSameCredentials,
diff -Nru freerdp2-2.3.0+dfsg1/debian/patches/0019-Check-smartcard_convert_string_list-for-NULL-string.patch freerdp2-2.3.0+dfsg1/debian/patches/0019-Check-smartcard_convert_string_list-for-NULL-string.patch
--- freerdp2-2.3.0+dfsg1/debian/patches/0019-Check-smartcard_convert_string_list-for-NULL-string.patch	1970-01-01 01:00:00.000000000 +0100
+++ freerdp2-2.3.0+dfsg1/debian/patches/0019-Check-smartcard_convert_string_list-for-NULL-string.patch	2021-04-29 11:55:48.000000000 +0200
@@ -0,0 +1,31 @@
+From 42f9dff46f736eb3f58d4bb1731710bda00608f9 Mon Sep 17 00:00:00 2001
+From: akallabeth <akallabeth@posteo.net>
+Date: Tue, 9 Mar 2021 09:22:39 +0100
+Subject: [PATCH 19/36] Check smartcard_convert_string_list for NULL string
+
+In #6821 it has been reported that there are buggy smartcard
+drivers that report a string size but fail to allocate the string
+itself. This check avoids a crash with such input parameters
+
+(cherry picked from commit f8b1e662b33f7b8f77cf6582d549348c2d048a2e)
+---
+ channels/smartcard/client/smartcard_pack.c | 3 +++
+ 1 file changed, 3 insertions(+)
+
+diff --git a/channels/smartcard/client/smartcard_pack.c b/channels/smartcard/client/smartcard_pack.c
+index 83c9d3023..f70eb4e5d 100644
+--- a/channels/smartcard/client/smartcard_pack.c
++++ b/channels/smartcard/client/smartcard_pack.c
+@@ -349,6 +349,9 @@ static char* smartcard_convert_string_list(const void* in, size_t bytes, BOOL un
+ 	if (bytes < 1)
+ 		return NULL;
+ 
++	if (in == NULL)
++		return NULL;
++
+ 	if (unicode)
+ 	{
+ 		length = (bytes / sizeof(WCHAR)) - 1;
+-- 
+2.30.2
+
diff -Nru freerdp2-2.3.0+dfsg1/debian/patches/0020-Use-specific-names-for-drive-hotplug-special-values.patch freerdp2-2.3.0+dfsg1/debian/patches/0020-Use-specific-names-for-drive-hotplug-special-values.patch
--- freerdp2-2.3.0+dfsg1/debian/patches/0020-Use-specific-names-for-drive-hotplug-special-values.patch	1970-01-01 01:00:00.000000000 +0100
+++ freerdp2-2.3.0+dfsg1/debian/patches/0020-Use-specific-names-for-drive-hotplug-special-values.patch	2021-04-29 12:04:04.000000000 +0200
@@ -0,0 +1,57 @@
+From 187cbdfe2c0abdef554306394d12a9b28a5100eb Mon Sep 17 00:00:00 2001
+From: akallabeth <akallabeth@posteo.net>
+Date: Tue, 9 Mar 2021 12:09:58 +0100
+Subject: [PATCH 20/36] Use specific names for drive hotplug special values
+
+(cherry picked from commit b1be3d78fcc63a5842f7707a139b2582a4a42b21)
+---
+ client/common/cmdline.c | 24 ++++++++++++++++++++++--
+ 1 file changed, 22 insertions(+), 2 deletions(-)
+
+--- a/client/common/cmdline.c
++++ b/client/common/cmdline.c
+@@ -120,6 +120,23 @@
+ 	return TRUE;
+ }
+ 
++static char* name_from_path(const char* path)
++{
++	const char* name = "NULL";
++	if (path)
++	{
++		if (_strnicmp(path, "%", 2) == 0)
++			name = "home";
++		else if (_strnicmp(path, "*", 2) == 0)
++			name = "hotplug-all";
++		else if (_strnicmp(path, "DynamicDrives", 2) == 0)
++			name = "hotplug";
++		else
++			name = path;
++	}
++	return _strdup(name);
++}
++
+ static BOOL freerdp_client_add_drive(rdpSettings* settings, const char* path, const char* name)
+ {
+ 	RDPDR_DRIVE* drive;
+@@ -151,8 +168,10 @@
+ 			goto fail;
+ 	}
+ 	else /* We need a name to send to the server. */
+-	    if (!(drive->Name = _strdup(path)))
+-		goto fail;
++	{
++		if (!(drive->Name = name_from_path(path)))
++			goto fail;
++	}
+ 
+ 	if (!path || !freerdp_sanitize_drive_name(drive->Name, "\\/", "__"))
+ 		goto fail;
+@@ -3557,6 +3576,7 @@
+ 			/* Syntax: Comma seperated list of the following entries:
+ 			 * '*'              ... Redirect all drives, including hotplug
+ 			 * 'DynamicDrives'  ... hotplug
++			 * '%'              ... user home directory
+ 			 * <label>(<path>)  ... One or more paths to redirect.
+ 			 * <path>(<label>)  ... One or more paths to redirect.
+ 			 * <path>           ... One or more paths to redirect.
diff -Nru freerdp2-2.3.0+dfsg1/debian/patches/0021-Filter-RDPDR-types-other-than-drives-on-windows-hotp.patch freerdp2-2.3.0+dfsg1/debian/patches/0021-Filter-RDPDR-types-other-than-drives-on-windows-hotp.patch
--- freerdp2-2.3.0+dfsg1/debian/patches/0021-Filter-RDPDR-types-other-than-drives-on-windows-hotp.patch	1970-01-01 01:00:00.000000000 +0100
+++ freerdp2-2.3.0+dfsg1/debian/patches/0021-Filter-RDPDR-types-other-than-drives-on-windows-hotp.patch	2021-04-29 11:55:48.000000000 +0200
@@ -0,0 +1,36 @@
+From c37593d9fc84f6344381cbfcf0631d3798d169b0 Mon Sep 17 00:00:00 2001
+From: Armin Novak <armin.novak@thincast.com>
+Date: Tue, 9 Mar 2021 12:23:37 +0100
+Subject: [PATCH 21/36] Filter RDPDR types other than drives on windows hotplug
+
+(cherry picked from commit 6f599eabbedace4adc215186783deec680057003)
+---
+ channels/rdpdr/client/rdpdr_main.c | 5 ++++-
+ 1 file changed, 4 insertions(+), 1 deletion(-)
+
+diff --git a/channels/rdpdr/client/rdpdr_main.c b/channels/rdpdr/client/rdpdr_main.c
+index e59bf0f64..617ea4287 100644
+--- a/channels/rdpdr/client/rdpdr_main.c
++++ b/channels/rdpdr/client/rdpdr_main.c
+@@ -129,7 +129,7 @@ static UINT drive_hotplug_thread_terminate(rdpdrPlugin* rdpdr)
+ 
+ #elif _WIN32
+ 
+-BOOL check_path(char* path)
++BOOL check_path(const char* path)
+ {
+ 	UINT type = GetDriveTypeA(path);
+ 
+@@ -244,6 +244,9 @@ LRESULT CALLBACK hotplug_proc(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam)
+ 									device_ext = (DEVICE_DRIVE_EXT*)ListDictionary_GetItemValue(
+ 									    rdpdr->devman->devices, (void*)keys[j]);
+ 
++									if (device_ext->device.type != RDPDR_DTYP_FILESYSTEM)
++										continue;
++
+ 									if (device_ext->path[0] == drive_name_upper ||
+ 									    device_ext->path[0] == drive_name_lower)
+ 									{
+-- 
+2.30.2
+
diff -Nru freerdp2-2.3.0+dfsg1/debian/patches/0023-use-tlsOut-BIO-when-using-websocket-in-rdg_bio_ctrl.patch freerdp2-2.3.0+dfsg1/debian/patches/0023-use-tlsOut-BIO-when-using-websocket-in-rdg_bio_ctrl.patch
--- freerdp2-2.3.0+dfsg1/debian/patches/0023-use-tlsOut-BIO-when-using-websocket-in-rdg_bio_ctrl.patch	1970-01-01 01:00:00.000000000 +0100
+++ freerdp2-2.3.0+dfsg1/debian/patches/0023-use-tlsOut-BIO-when-using-websocket-in-rdg_bio_ctrl.patch	2021-04-29 11:55:48.000000000 +0200
@@ -0,0 +1,57 @@
+From c1387856692d28ded58f66bff2e294edf0f9c0ac Mon Sep 17 00:00:00 2001
+From: akarl <mike@mwsys.mine.bz>
+Date: Fri, 5 Mar 2021 18:19:06 +0100
+Subject: [PATCH 23/36] use tlsOut BIO when using websocket in rdg_bio_ctrl
+
+(cherry picked from commit 0e19c443e41cdc031a38a6ea24298972420af778)
+---
+ libfreerdp/core/gateway/rdg.c | 12 ++++++++++--
+ 1 file changed, 10 insertions(+), 2 deletions(-)
+
+diff --git a/libfreerdp/core/gateway/rdg.c b/libfreerdp/core/gateway/rdg.c
+index 4ac98b1c9..ff2d06aa5 100644
+--- a/libfreerdp/core/gateway/rdg.c
++++ b/libfreerdp/core/gateway/rdg.c
+@@ -1537,7 +1537,7 @@ DWORD rdg_get_event_handles(rdpRdg* rdg, HANDLE* events, DWORD count)
+ 			return 0;
+ 	}
+ 
+-	if (rdg->tlsIn && rdg->tlsIn->bio)
++	if (!rdg->transferEncoding.isWebsocketTransport && rdg->tlsIn && rdg->tlsIn->bio)
+ 	{
+ 		if (events && (nCount < count))
+ 		{
+@@ -2403,7 +2403,8 @@ static long rdg_bio_ctrl(BIO* bio, int cmd, long arg1, void* arg2)
+ 	if (cmd == BIO_CTRL_FLUSH)
+ 	{
+ 		(void)BIO_flush(tlsOut->bio);
+-		(void)BIO_flush(tlsIn->bio);
++		if (!rdg->transferEncoding.isWebsocketTransport)
++			(void)BIO_flush(tlsIn->bio);
+ 		status = 1;
+ 	}
+ 	else if (cmd == BIO_C_SET_NONBLOCK)
+@@ -2418,6 +2419,10 @@ static long rdg_bio_ctrl(BIO* bio, int cmd, long arg1, void* arg2)
+ 	else if (cmd == BIO_C_WRITE_BLOCKED)
+ 	{
+ 		BIO* bio = tlsIn->bio;
++
++		if (rdg->transferEncoding.isWebsocketTransport)
++			bio = tlsOut->bio;
++
+ 		status = BIO_write_blocked(bio);
+ 	}
+ 	else if (cmd == BIO_C_WAIT_READ)
+@@ -2437,6 +2442,9 @@ static long rdg_bio_ctrl(BIO* bio, int cmd, long arg1, void* arg2)
+ 		int timeout = (int)arg1;
+ 		BIO* bio = tlsIn->bio;
+ 
++		if (rdg->transferEncoding.isWebsocketTransport)
++			bio = tlsOut->bio;
++
+ 		if (BIO_write_blocked(bio))
+ 			status = BIO_wait_write(bio, timeout);
+ 		else if (BIO_read_blocked(bio))
+-- 
+2.30.2
+
diff -Nru freerdp2-2.3.0+dfsg1/debian/patches/0024-Added-bounds-checks-to-gfx-commands.patch freerdp2-2.3.0+dfsg1/debian/patches/0024-Added-bounds-checks-to-gfx-commands.patch
--- freerdp2-2.3.0+dfsg1/debian/patches/0024-Added-bounds-checks-to-gfx-commands.patch	1970-01-01 01:00:00.000000000 +0100
+++ freerdp2-2.3.0+dfsg1/debian/patches/0024-Added-bounds-checks-to-gfx-commands.patch	2021-04-29 11:55:48.000000000 +0200
@@ -0,0 +1,85 @@
+From 9308d0c6365861fbd2eafa0a0881acef460cfc15 Mon Sep 17 00:00:00 2001
+From: Armin Novak <armin.novak@thincast.com>
+Date: Fri, 12 Mar 2021 09:12:28 +0100
+Subject: [PATCH 24/36] Added bounds checks to gfx commands
+
+(cherry picked from commit dd61853142a07af0eca80c901292075373a6b2d6)
+---
+ libfreerdp/gdi/gfx.c | 33 +++++++++++++++++++++++++++++++++
+ 1 file changed, 33 insertions(+)
+
+diff --git a/libfreerdp/gdi/gfx.c b/libfreerdp/gdi/gfx.c
+index 238c8138d..2221cc3f7 100644
+--- a/libfreerdp/gdi/gfx.c
++++ b/libfreerdp/gdi/gfx.c
+@@ -42,6 +42,27 @@ static BOOL is_rect_valid(const RECTANGLE_16* rect, size_t width, size_t height)
+ 	return TRUE;
+ }
+ 
++static BOOL is_within_surface(const gdiGfxSurface* surface, const RDPGFX_SURFACE_COMMAND* cmd)
++{
++	RECTANGLE_16 rect;
++	if (!surface || !cmd)
++		return FALSE;
++	rect.left = cmd->left;
++	rect.top = cmd->top;
++	rect.right = cmd->right;
++	rect.bottom = cmd->bottom;
++	if (!is_rect_valid(&rect, surface->width, surface->height))
++	{
++		WLog_ERR(TAG,
++		         "%s: Command rect %" PRIu32 "x" PRIu32 "-" PRIu32 "x" PRIu32
++		         " not within bounds of " PRIu32 "x" PRIu32,
++		         __FUNCTION__, rect.left, rect.top, cmd->width, cmd->height, surface->width,
++		         surface->height);
++		return FALSE;
++	}
++	return TRUE;
++}
++
+ static DWORD gfx_align_scanline(DWORD widthInBytes, DWORD alignment)
+ {
+ 	const UINT32 align = alignment;
+@@ -259,6 +280,9 @@ static UINT gdi_SurfaceCommand_Uncompressed(rdpGdi* gdi, RdpgfxClientContext* co
+ 		return ERROR_NOT_FOUND;
+ 	}
+ 
++	if (!is_within_surface(surface, cmd))
++		return ERROR_INVALID_DATA;
++
+ 	if (!freerdp_image_copy(surface->data, surface->format, surface->scanline, cmd->left, cmd->top,
+ 	                        cmd->width, cmd->height, cmd->data, cmd->format, 0, 0, 0, NULL,
+ 	                        FREERDP_FLIP_NONE))
+@@ -414,6 +438,9 @@ static UINT gdi_SurfaceCommand_Planar(rdpGdi* gdi, RdpgfxClientContext* context,
+ 
+ 	DstData = surface->data;
+ 
++	if (!is_within_surface(surface, cmd))
++		return ERROR_INVALID_DATA;
++
+ 	if (!planar_decompress(surface->codecs->planar, cmd->data, cmd->length, cmd->width, cmd->height,
+ 	                       DstData, surface->format, surface->scanline, cmd->left, cmd->top,
+ 	                       cmd->width, cmd->height, FALSE))
+@@ -686,6 +713,9 @@ static UINT gdi_SurfaceCommand_Alpha(rdpGdi* gdi, RdpgfxClientContext* context,
+ 		return ERROR_NOT_FOUND;
+ 	}
+ 
++	if (!is_within_surface(surface, cmd))
++		return ERROR_INVALID_DATA;
++
+ 	Stream_Read_UINT16(&s, alphaSig);
+ 	Stream_Read_UINT16(&s, compressed);
+ 
+@@ -815,6 +845,9 @@ static UINT gdi_SurfaceCommand_Progressive(rdpGdi* gdi, RdpgfxClientContext* con
+ 		return ERROR_NOT_FOUND;
+ 	}
+ 
++	if (!is_within_surface(surface, cmd))
++		return ERROR_INVALID_DATA;
++
+ 	rc = progressive_create_surface_context(surface->codecs->progressive, cmd->surfaceId,
+ 	                                        surface->width, surface->height);
+ 
+-- 
+2.30.2
+
diff -Nru freerdp2-2.3.0+dfsg1/debian/patches/0025-Added-bounds-check-in-rdpgfx_recv_wire_to_surface_1_.patch freerdp2-2.3.0+dfsg1/debian/patches/0025-Added-bounds-check-in-rdpgfx_recv_wire_to_surface_1_.patch
--- freerdp2-2.3.0+dfsg1/debian/patches/0025-Added-bounds-check-in-rdpgfx_recv_wire_to_surface_1_.patch	1970-01-01 01:00:00.000000000 +0100
+++ freerdp2-2.3.0+dfsg1/debian/patches/0025-Added-bounds-check-in-rdpgfx_recv_wire_to_surface_1_.patch	2021-04-29 11:55:48.000000000 +0200
@@ -0,0 +1,37 @@
+From 9249d900c466d3341f4c4e072fc535e9aecc0e9d Mon Sep 17 00:00:00 2001
+From: Armin Novak <armin.novak@thincast.com>
+Date: Fri, 12 Mar 2021 09:29:55 +0100
+Subject: [PATCH 25/36] Added bounds check in rdpgfx_recv_wire_to_surface_1_pdu
+
+(cherry picked from commit 5fc3846f7793d4afe48387ac3aeffd4ad6852bab)
+---
+ channels/rdpgfx/client/rdpgfx_main.c | 13 +++++++++++++
+ 1 file changed, 13 insertions(+)
+
+diff --git a/channels/rdpgfx/client/rdpgfx_main.c b/channels/rdpgfx/client/rdpgfx_main.c
+index 94b5b68de..67b3a7db4 100644
+--- a/channels/rdpgfx/client/rdpgfx_main.c
++++ b/channels/rdpgfx/client/rdpgfx_main.c
+@@ -999,6 +999,19 @@ static UINT rdpgfx_recv_wire_to_surface_1_pdu(RDPGFX_CHANNEL_CALLBACK* callback,
+ 	cmd.data = pdu.bitmapData;
+ 	cmd.extra = NULL;
+ 
++	if (cmd.right < cmd.left)
++	{
++		WLog_Print(gfx->log, WLOG_ERROR, "RecvWireToSurface1Pdu right=%" PRIu32 " < left=%" PRIu32,
++		           cmd.right, cmd.left);
++		return ERROR_INVALID_DATA;
++	}
++	if (cmd.bottom < cmd.top)
++	{
++		WLog_Print(gfx->log, WLOG_ERROR, "RecvWireToSurface1Pdu bottom=%" PRIu32 " < top=%" PRIu32,
++		           cmd.bottom, cmd.top);
++		return ERROR_INVALID_DATA;
++	}
++
+ 	if ((error = rdpgfx_decode(gfx, &cmd)))
+ 		WLog_Print(gfx->log, WLOG_ERROR, "rdpgfx_decode failed with error %" PRIu32 "!", error);
+ 
+-- 
+2.30.2
+
diff -Nru freerdp2-2.3.0+dfsg1/debian/patches/0026-Added-fuzzying-test-for-planar-decoder.patch freerdp2-2.3.0+dfsg1/debian/patches/0026-Added-fuzzying-test-for-planar-decoder.patch
--- freerdp2-2.3.0+dfsg1/debian/patches/0026-Added-fuzzying-test-for-planar-decoder.patch	1970-01-01 01:00:00.000000000 +0100
+++ freerdp2-2.3.0+dfsg1/debian/patches/0026-Added-fuzzying-test-for-planar-decoder.patch	2021-04-29 11:55:48.000000000 +0200
@@ -0,0 +1,153 @@
+From bd3f9cfd9fda7da05b1a12fe9e48c69e3ac45e67 Mon Sep 17 00:00:00 2001
+From: Armin Novak <armin.novak@thincast.com>
+Date: Fri, 12 Mar 2021 10:07:44 +0100
+Subject: [PATCH 26/36] Added fuzzying test for planar decoder
+
+(cherry picked from commit 9bbc2cd094ac837a8f1196e80e7643c00436e486)
+---
+ .../codec/test/TestFreeRDPCodecPlanar.c       | 116 ++++++++++++++++++
+ 1 file changed, 116 insertions(+)
+
+diff --git a/libfreerdp/codec/test/TestFreeRDPCodecPlanar.c b/libfreerdp/codec/test/TestFreeRDPCodecPlanar.c
+index b1235ec8e..aac0a9f54 100644
+--- a/libfreerdp/codec/test/TestFreeRDPCodecPlanar.c
++++ b/libfreerdp/codec/test/TestFreeRDPCodecPlanar.c
+@@ -3,6 +3,7 @@
+ 
+ #include <winpr/crt.h>
+ #include <winpr/print.h>
++#include <winpr/crypto.h>
+ 
+ #include <freerdp/freerdp.h>
+ #include <freerdp/codec/color.h>
+@@ -5650,12 +5651,127 @@ fail:
+ 	return rc;
+ }
+ 
++static UINT32 prand(UINT32 max)
++{
++	UINT32 tmp;
++	if (max <= 1)
++		return 1;
++	winpr_RAND((BYTE*)&tmp, sizeof(tmp));
++	return tmp % (max - 1) + 1;
++}
++
++static BOOL FuzzPlanar(void)
++{
++	UINT32 x;
++	BOOL rc = FALSE;
++	const DWORD planarFlags = PLANAR_FORMAT_HEADER_NA | PLANAR_FORMAT_HEADER_RLE;
++	BITMAP_PLANAR_CONTEXT* planar = freerdp_bitmap_planar_context_new(planarFlags, 64, 64);
++
++	if (!planar)
++		goto fail;
++
++	for (x = 0; x < 10000; x++)
++	{
++		BYTE data[0x10000] = { 0 };
++		size_t dataSize = 0x10000;
++		BYTE dstData[0x10000] = { 0 };
++
++		UINT32 DstFormat;
++		UINT32 nDstStep;
++		UINT32 nXDst;
++		UINT32 nYDst;
++		UINT32 nDstWidth;
++		UINT32 nDstHeight;
++		BOOL invalid = TRUE;
++		do
++		{
++			switch (prand(17) - 1)
++			{
++				case 0:
++					DstFormat = PIXEL_FORMAT_RGB8;
++					break;
++				case 1:
++					DstFormat = PIXEL_FORMAT_BGR15;
++					break;
++				case 2:
++					DstFormat = PIXEL_FORMAT_RGB15;
++					break;
++				case 3:
++					DstFormat = PIXEL_FORMAT_ABGR15;
++					break;
++				case 4:
++					DstFormat = PIXEL_FORMAT_ABGR15;
++					break;
++				case 5:
++					DstFormat = PIXEL_FORMAT_BGR16;
++					break;
++				case 6:
++					DstFormat = PIXEL_FORMAT_RGB16;
++					break;
++				case 7:
++					DstFormat = PIXEL_FORMAT_BGR24;
++					break;
++				case 8:
++					DstFormat = PIXEL_FORMAT_RGB24;
++					break;
++				case 9:
++					DstFormat = PIXEL_FORMAT_BGRA32;
++					break;
++				case 10:
++					DstFormat = PIXEL_FORMAT_BGRX32;
++					break;
++				case 11:
++					DstFormat = PIXEL_FORMAT_RGBA32;
++					break;
++				case 12:
++					DstFormat = PIXEL_FORMAT_RGBX32;
++					break;
++				case 13:
++					DstFormat = PIXEL_FORMAT_ABGR32;
++					break;
++				case 14:
++					DstFormat = PIXEL_FORMAT_XBGR32;
++					break;
++				case 15:
++					DstFormat = PIXEL_FORMAT_ARGB32;
++					break;
++				case 16:
++					DstFormat = PIXEL_FORMAT_XRGB32;
++					break;
++				default:
++					break;
++			}
++			nDstStep = prand(sizeof(dstData));
++			nXDst = prand(nDstStep);
++			nYDst = prand(sizeof(dstData) / nDstStep);
++			nDstWidth = prand(nDstStep / GetBytesPerPixel(DstFormat));
++			nDstHeight = prand(sizeof(dstData) / nDstStep);
++			invalid = nXDst * GetBytesPerPixel(DstFormat) + (nYDst + nDstHeight) * nDstStep >
++			          sizeof(dstData);
++		} while (invalid);
++		printf("DstFormat=%s, nXDst=%" PRIu32 ", nYDst=%" PRIu32 ", nDstWidth=%" PRIu32
++		       ", nDstHeight=%" PRIu32 ", nDstStep=%" PRIu32 ", total size=%" PRIuz "\n",
++		       FreeRDPGetColorFormatName(DstFormat), nXDst, nYDst, nDstWidth, nDstHeight, nDstStep,
++		       sizeof(dstData));
++		planar_decompress(planar, data, dataSize, prand(4096), prand(4096), dstData, DstFormat,
++		                  nDstStep, nXDst, nYDst, nDstWidth, nDstHeight, prand(2));
++	}
++
++	rc = TRUE;
++fail:
++	freerdp_bitmap_planar_context_free(planar);
++	return rc;
++}
++
+ int TestFreeRDPCodecPlanar(int argc, char* argv[])
+ {
+ 	UINT32 x;
+ 	WINPR_UNUSED(argc);
+ 	WINPR_UNUSED(argv);
+ 
++	if (!FuzzPlanar())
++		return -2;
++
+ 	for (x = 0; x < colorFormatCount; x++)
+ 	{
+ 		if (!TestPlanar(colorFormatList[x]))
+-- 
+2.30.2
+
diff -Nru freerdp2-2.3.0+dfsg1/debian/patches/0027-Added-missing-bounds-check.patch freerdp2-2.3.0+dfsg1/debian/patches/0027-Added-missing-bounds-check.patch
--- freerdp2-2.3.0+dfsg1/debian/patches/0027-Added-missing-bounds-check.patch	1970-01-01 01:00:00.000000000 +0100
+++ freerdp2-2.3.0+dfsg1/debian/patches/0027-Added-missing-bounds-check.patch	2021-04-29 11:55:48.000000000 +0200
@@ -0,0 +1,96 @@
+From 602fb7d788446969ccfedb8dab4a9abd0ab7df23 Mon Sep 17 00:00:00 2001
+From: Armin Novak <armin.novak@thincast.com>
+Date: Fri, 12 Mar 2021 10:15:51 +0100
+Subject: [PATCH 27/36] Added missing bounds check.
+
+(cherry picked from commit 2e6069d95b997d0dc7d2cc118255570d22f0ae0c)
+---
+ libfreerdp/codec/planar.c | 23 +++++++++++++++++++----
+ 1 file changed, 19 insertions(+), 4 deletions(-)
+
+diff --git a/libfreerdp/codec/planar.c b/libfreerdp/codec/planar.c
+index f31c2d46a..8588a9e21 100644
+--- a/libfreerdp/codec/planar.c
++++ b/libfreerdp/codec/planar.c
+@@ -508,7 +508,7 @@ static INLINE BOOL writeLine(BYTE** ppRgba, UINT32 DstFormat, UINT32 width, cons
+ static INLINE BOOL planar_decompress_planes_raw(const BYTE* pSrcData[4], BYTE* pDstData,
+                                                 UINT32 DstFormat, UINT32 nDstStep, UINT32 nXDst,
+                                                 UINT32 nYDst, UINT32 nWidth, UINT32 nHeight,
+-                                                BOOL vFlip)
++                                                BOOL vFlip, UINT32 totalHeight)
+ {
+ 	INT32 y;
+ 	INT32 beg, end, inc;
+@@ -516,6 +516,7 @@ static INLINE BOOL planar_decompress_planes_raw(const BYTE* pSrcData[4], BYTE* p
+ 	const BYTE* pG = pSrcData[1];
+ 	const BYTE* pB = pSrcData[2];
+ 	const BYTE* pA = pSrcData[3];
++	const UINT32 bpp = GetBytesPerPixel(DstFormat);
+ 
+ 	if (vFlip)
+ 	{
+@@ -530,9 +531,20 @@ static INLINE BOOL planar_decompress_planes_raw(const BYTE* pSrcData[4], BYTE* p
+ 		inc = 1;
+ 	}
+ 
++	if (nYDst + nHeight > totalHeight)
++		return FALSE;
++
++	if ((nXDst + nWidth) * bpp > nDstStep)
++		return FALSE;
++
+ 	for (y = beg; y != end; y += inc)
+ 	{
+-		BYTE* pRGB = &pDstData[((nYDst + y) * nDstStep) + (nXDst * GetBytesPerPixel(DstFormat))];
++		BYTE* pRGB;
++
++		if (y > (INT64)nHeight)
++			return FALSE;
++
++		pRGB = &pDstData[((nYDst + y) * nDstStep) + (nXDst * bpp)];
+ 
+ 		if (!writeLine(&pRGB, DstFormat, nWidth, &pR, &pG, &pB, &pA))
+ 			return FALSE;
+@@ -739,6 +751,7 @@ BOOL planar_decompress(BITMAP_PLANAR_CONTEXT* planar, const BYTE* pSrcData, UINT
+ 		UINT32 TempFormat;
+ 		BYTE* pTempData = pDstData;
+ 		UINT32 nTempStep = nDstStep;
++		UINT32 nTotalHeight = nYDst + nDstHeight;
+ 
+ 		if (useAlpha)
+ 			TempFormat = PIXEL_FORMAT_BGRA32;
+@@ -749,12 +762,13 @@ BOOL planar_decompress(BITMAP_PLANAR_CONTEXT* planar, const BYTE* pSrcData, UINT
+ 		{
+ 			pTempData = planar->pTempData;
+ 			nTempStep = planar->nTempStep;
++			nTotalHeight = planar->maxHeight;
+ 		}
+ 
+ 		if (!rle) /* RAW */
+ 		{
+ 			if (!planar_decompress_planes_raw(planes, pTempData, TempFormat, nTempStep, nXDst,
+-			                                  nYDst, nSrcWidth, nSrcHeight, vFlip))
++			                                  nYDst, nSrcWidth, nSrcHeight, vFlip, nTotalHeight))
+ 				return FALSE;
+ 
+ 			if (alpha)
+@@ -819,6 +833,7 @@ BOOL planar_decompress(BITMAP_PLANAR_CONTEXT* planar, const BYTE* pSrcData, UINT
+ 		UINT32 TempFormat;
+ 		BYTE* pTempData = planar->pTempData;
+ 		UINT32 nTempStep = planar->nTempStep;
++		UINT32 nTotalHeight = planar->maxHeight;
+ 
+ 		if (useAlpha)
+ 			TempFormat = PIXEL_FORMAT_BGRA32;
+@@ -901,7 +916,7 @@ BOOL planar_decompress(BITMAP_PLANAR_CONTEXT* planar, const BYTE* pSrcData, UINT
+ 			}
+ 
+ 			if (!planar_decompress_planes_raw(planes, pTempData, TempFormat, nTempStep, nXDst,
+-			                                  nYDst, nSrcWidth, nSrcHeight, vFlip))
++			                                  nYDst, nSrcWidth, nSrcHeight, vFlip, nTotalHeight))
+ 				return FALSE;
+ 
+ 			if (alpha)
+-- 
+2.30.2
+
diff -Nru freerdp2-2.3.0+dfsg1/debian/patches/0028-Fixed-mac-issues-with-smartcard-context-cleanup-6890.patch freerdp2-2.3.0+dfsg1/debian/patches/0028-Fixed-mac-issues-with-smartcard-context-cleanup-6890.patch
--- freerdp2-2.3.0+dfsg1/debian/patches/0028-Fixed-mac-issues-with-smartcard-context-cleanup-6890.patch	1970-01-01 01:00:00.000000000 +0100
+++ freerdp2-2.3.0+dfsg1/debian/patches/0028-Fixed-mac-issues-with-smartcard-context-cleanup-6890.patch	2021-04-29 11:55:48.000000000 +0200
@@ -0,0 +1,63 @@
+From 9ba06525d6bef66d457264e202fbb8f38473a686 Mon Sep 17 00:00:00 2001
+From: akallabeth <akallabeth@users.noreply.github.com>
+Date: Fri, 12 Mar 2021 08:56:23 +0100
+Subject: [PATCH 28/36] Fixed mac issues with smartcard context cleanup (#6890)
+
+(cherry picked from commit b8a8ae4622a2c426c54c300b32c50316f0af42b0)
+---
+ channels/smartcard/client/smartcard_main.c | 25 +++-------------------
+ 1 file changed, 3 insertions(+), 22 deletions(-)
+
+diff --git a/channels/smartcard/client/smartcard_main.c b/channels/smartcard/client/smartcard_main.c
+index 82fb58728..2df4c14e3 100644
+--- a/channels/smartcard/client/smartcard_main.c
++++ b/channels/smartcard/client/smartcard_main.c
+@@ -180,6 +180,7 @@ void smartcard_context_free(void* pCtx)
+ 
+ 	/* cancel blocking calls like SCardGetStatusChange */
+ 	SCardCancel(pContext->hContext);
++	SCardReleaseContext(pContext->hContext);
+ 
+ 	if (MessageQueue_PostQuit(pContext->IrpQueue, 0) &&
+ 	    (WaitForSingleObject(pContext->thread, INFINITE) == WAIT_FAILED))
+@@ -237,7 +238,7 @@ static void smartcard_release_all_contexts(SMARTCARD_DEVICE* smartcard)
+ 
+ 	/* Put thread to sleep so that PC/SC can process the cancel requests. This fixes a race
+ 	 * condition that sometimes caused the pc/sc daemon to crash on MacOS (_xpc_api_misuse) */
+-	Sleep(100);
++	SleepEx(100, FALSE);
+ 
+ 	/**
+ 	 * Call SCardReleaseContext on remaining contexts and remove them from rgSCardContextList.
+@@ -251,27 +252,7 @@ static void smartcard_release_all_contexts(SMARTCARD_DEVICE* smartcard)
+ 
+ 		for (index = 0; index < keyCount; index++)
+ 		{
+-			pContext = (SMARTCARD_CONTEXT*)ListDictionary_Remove(smartcard->rgSCardContextList,
+-			                                                     (void*)pKeys[index]);
+-
+-			if (!pContext)
+-				continue;
+-
+-			hContext = pContext->hContext;
+-
+-			if (SCardIsValidContext(hContext) == SCARD_S_SUCCESS)
+-			{
+-				SCardReleaseContext(hContext);
+-
+-				if (MessageQueue_PostQuit(pContext->IrpQueue, 0) &&
+-				    (WaitForSingleObject(pContext->thread, INFINITE) == WAIT_FAILED))
+-					WLog_ERR(TAG, "WaitForSingleObject failed with error %" PRIu32 "!",
+-					         GetLastError());
+-
+-				CloseHandle(pContext->thread);
+-				MessageQueue_Free(pContext->IrpQueue);
+-				free(pContext);
+-			}
++			ListDictionary_SetItemValue(smartcard->rgSCardContextList, (void*)pKeys[index], NULL);
+ 		}
+ 
+ 		free(pKeys);
+-- 
+2.30.2
+
diff -Nru freerdp2-2.3.0+dfsg1/debian/patches/0031-Fix-monitor-list.patch freerdp2-2.3.0+dfsg1/debian/patches/0031-Fix-monitor-list.patch
--- freerdp2-2.3.0+dfsg1/debian/patches/0031-Fix-monitor-list.patch	1970-01-01 01:00:00.000000000 +0100
+++ freerdp2-2.3.0+dfsg1/debian/patches/0031-Fix-monitor-list.patch	2021-04-29 11:55:48.000000000 +0200
@@ -0,0 +1,29 @@
+From 9e1e3185128146f74f4b4694b56caa1478a0df77 Mon Sep 17 00:00:00 2001
+From: Armin Novak <armin.novak@thincast.com>
+Date: Fri, 12 Mar 2021 11:53:34 +0100
+Subject: [PATCH 31/36] Fix /monitor-list
+
+---
+ client/X11/cli/xfreerdp.c | 4 +---
+ 1 file changed, 1 insertion(+), 3 deletions(-)
+
+diff --git a/client/X11/cli/xfreerdp.c b/client/X11/cli/xfreerdp.c
+index 5b7021944..8db4d39e7 100644
+--- a/client/X11/cli/xfreerdp.c
++++ b/client/X11/cli/xfreerdp.c
+@@ -59,11 +59,9 @@ int main(int argc, char* argv[])
+ 	status = freerdp_client_settings_parse_command_line(context->settings, argc, argv, FALSE);
+ 	if (status)
+ 	{
+-		BOOL list = settings->ListMonitors;
+-
+ 		rc = freerdp_client_settings_command_line_status_print(settings, status, argc, argv);
+ 
+-		if (list)
++		if (settings->ListMonitors)
+ 			xf_list_monitors(xfc);
+ 
+ 		goto out;
+-- 
+2.30.2
+
diff -Nru freerdp2-2.3.0+dfsg1/debian/patches/0032-Fixed-CodeQL-warnings.patch freerdp2-2.3.0+dfsg1/debian/patches/0032-Fixed-CodeQL-warnings.patch
--- freerdp2-2.3.0+dfsg1/debian/patches/0032-Fixed-CodeQL-warnings.patch	1970-01-01 01:00:00.000000000 +0100
+++ freerdp2-2.3.0+dfsg1/debian/patches/0032-Fixed-CodeQL-warnings.patch	2021-04-29 11:55:48.000000000 +0200
@@ -0,0 +1,680 @@
+From 7beda29158ece1234c41e5502d44062c79ac9dba Mon Sep 17 00:00:00 2001
+From: akallabeth <akallabeth@posteo.net>
+Date: Mon, 25 Jan 2021 10:06:01 +0100
+Subject: [PATCH 32/36] Fixed CodeQL warnings
+
+(cherry picked from commit 95a9e60827c91cb9b924d7ce3c220c30bd36907d)
+---
+ channels/rdpsnd/server/rdpsnd_main.c          |  2 +-
+ .../urbdrc/client/libusb/libusb_udevman.c     |  2 +-
+ channels/video/client/video_main.c            |  4 +--
+ client/Wayland/wlf_pointer.c                  |  4 +--
+ client/X11/xf_gdi.c                           |  4 +--
+ client/X11/xf_gfx.c                           |  4 +--
+ client/X11/xf_graphics.c                      |  6 ++--
+ client/X11/xf_rail.c                          |  4 +--
+ libfreerdp/codec/clear.c                      |  4 +--
+ libfreerdp/codec/color.c                      |  6 ++--
+ libfreerdp/codec/h264.c                       |  6 ++--
+ libfreerdp/codec/nsc_encode.c                 |  4 +--
+ libfreerdp/codec/nsc_sse2.c                   |  4 +--
+ libfreerdp/codec/progressive.c                |  4 +--
+ libfreerdp/core/gcc.c                         |  8 +++---
+ libfreerdp/gdi/bitmap.c                       |  3 +-
+ libfreerdp/gdi/gdi.c                          |  2 +-
+ libfreerdp/gdi/gfx.c                          |  6 ++--
+ libfreerdp/gdi/graphics.c                     |  2 +-
+ libfreerdp/gdi/shape.c                        |  2 +-
+ libfreerdp/gdi/video.c                        |  2 +-
+ libfreerdp/primitives/prim_copy.c             |  4 +--
+ libfreerdp/primitives/primitives.c            |  2 +-
+ uwac/libuwac/uwac-window.c                    |  9 +++---
+ winpr/include/winpr/print.h                   |  2 +-
+ winpr/libwinpr/utils/lodepng/lodepng.c        | 28 ++++++++++---------
+ winpr/libwinpr/utils/print.c                  | 13 ++++-----
+ 27 files changed, 72 insertions(+), 69 deletions(-)
+
+diff --git a/channels/rdpsnd/server/rdpsnd_main.c b/channels/rdpsnd/server/rdpsnd_main.c
+index cb9f5fe92..be0ca149f 100644
+--- a/channels/rdpsnd/server/rdpsnd_main.c
++++ b/channels/rdpsnd/server/rdpsnd_main.c
+@@ -422,7 +422,7 @@ static UINT rdpsnd_server_send_wave_pdu(RdpsndServerContext* context, UINT16 wTi
+ 	Stream_Seek(s, 3);                                       /* bPad */
+ 	start = Stream_GetPosition(s);
+ 	src = context->priv->out_buffer;
+-	length = context->priv->out_pending_frames * context->priv->src_bytes_per_frame;
++	length = context->priv->out_pending_frames * context->priv->src_bytes_per_frame * 1ULL;
+ 
+ 	if (!freerdp_dsp_encode(context->priv->dsp_context, context->src_format, src, length, s))
+ 		return ERROR_INTERNAL_ERROR;
+diff --git a/channels/urbdrc/client/libusb/libusb_udevman.c b/channels/urbdrc/client/libusb/libusb_udevman.c
+index ec7b0b322..1638b8c13 100644
+--- a/channels/urbdrc/client/libusb/libusb_udevman.c
++++ b/channels/urbdrc/client/libusb/libusb_udevman.c
+@@ -536,7 +536,7 @@ static BOOL device_is_filtered(struct libusb_device* dev,
+ 
+ 				for (x = 0; x < config->bNumInterfaces; x++)
+ 				{
+-					uint8_t y;
++					int y;
+ 					const struct libusb_interface* ifc = &config->interface[x];
+ 					for (y = 0; y < ifc->num_altsetting; y++)
+ 					{
+diff --git a/channels/video/client/video_main.c b/channels/video/client/video_main.c
+index 10fb30d1a..a21e7cdf2 100644
+--- a/channels/video/client/video_main.c
++++ b/channels/video/client/video_main.c
+@@ -666,7 +666,7 @@ static void video_timer(VideoClientContext* video, UINT64 now)
+ 	presentation = frame->presentation;
+ 
+ 	priv->publishedFrames++;
+-	memcpy(presentation->surfaceData, frame->surfaceData, frame->w * frame->h * 4);
++	memcpy(presentation->surfaceData, frame->surfaceData, frame->w * frame->h * 4ULL);
+ 
+ 	video->showSurface(video, presentation->surface);
+ 
+@@ -848,7 +848,7 @@ static UINT video_VideoData(VideoClientContext* context, TSMM_VIDEO_DATA* data)
+ 			frame->w = presentation->SourceWidth;
+ 			frame->h = presentation->SourceHeight;
+ 
+-			frame->surfaceData = BufferPool_Take(priv->surfacePool, frame->w * frame->h * 4);
++			frame->surfaceData = BufferPool_Take(priv->surfacePool, frame->w * frame->h * 4ULL);
+ 			if (!frame->surfaceData)
+ 			{
+ 				WLog_ERR(TAG, "unable to allocate frame data");
+diff --git a/client/Wayland/wlf_pointer.c b/client/Wayland/wlf_pointer.c
+index 64166590c..decde7ff3 100644
+--- a/client/Wayland/wlf_pointer.c
++++ b/client/Wayland/wlf_pointer.c
+@@ -42,7 +42,7 @@ static BOOL wlf_Pointer_New(rdpContext* context, rdpPointer* pointer)
+ 	if (!ptr)
+ 		return FALSE;
+ 
+-	ptr->size = pointer->width * pointer->height * 4;
++	ptr->size = pointer->width * pointer->height * 4ULL;
+ 	ptr->data = _aligned_malloc(ptr->size, 16);
+ 
+ 	if (!ptr->data)
+@@ -92,7 +92,7 @@ static BOOL wlf_Pointer_Set(rdpContext* context, const rdpPointer* pointer)
+ 	    !wlf_scale_coordinates(context, &w, &h, FALSE))
+ 		return FALSE;
+ 
+-	size = w * h * 4;
++	size = w * h * 4ULL;
+ 	data = malloc(size);
+ 
+ 	if (!data)
+diff --git a/client/X11/xf_gdi.c b/client/X11/xf_gdi.c
+index 949e62d12..4f52853bf 100644
+--- a/client/X11/xf_gdi.c
++++ b/client/X11/xf_gdi.c
+@@ -231,7 +231,7 @@ static Pixmap xf_brush_new(xfContext* xfc, UINT32 width, UINT32 height, UINT32 b
+ 	if (data)
+ 	{
+ 		brushFormat = gdi_get_pixel_format(bpp);
+-		cdata = (BYTE*)_aligned_malloc(width * height * 4, 16);
++		cdata = (BYTE*)_aligned_malloc(width * height * 4ULL, 16);
+ 		freerdp_image_copy(cdata, gdi->dstFormat, 0, 0, 0, width, height, data, brushFormat, 0, 0,
+ 		                   0, &xfc->context.gdi->palette, FREERDP_FLIP_NONE);
+ 		image = XCreateImage(xfc->display, xfc->visual, xfc->depth, ZPixmap, 0, (char*)cdata, width,
+@@ -1066,7 +1066,7 @@ static BOOL xf_gdi_surface_bits(rdpContext* context, const SURFACE_BITS_COMMAND*
+ 		case RDP_CODEC_ID_NONE:
+ 			pSrcData = cmd->bmp.bitmapData;
+ 			format = gdi_get_pixel_format(cmd->bmp.bpp);
+-			size = cmd->bmp.width * cmd->bmp.height * GetBytesPerPixel(format);
++			size = cmd->bmp.width * cmd->bmp.height * GetBytesPerPixel(format) * 1ULL;
+ 			if (size > cmd->bmp.bitmapDataLength)
+ 			{
+ 				WLog_ERR(TAG, "Short nocodec message: got %" PRIu32 " bytes, require %" PRIuz,
+diff --git a/client/X11/xf_gfx.c b/client/X11/xf_gfx.c
+index cb3423ea0..97d3ad3cc 100644
+--- a/client/X11/xf_gfx.c
++++ b/client/X11/xf_gfx.c
+@@ -288,7 +288,7 @@ static UINT xf_CreateSurface(RdpgfxClientContext* context,
+ 
+ 	surface->gdi.scanline = surface->gdi.width * GetBytesPerPixel(surface->gdi.format);
+ 	surface->gdi.scanline = x11_pad_scanline(surface->gdi.scanline, xfc->scanline_pad);
+-	size = surface->gdi.scanline * surface->gdi.height;
++	size = surface->gdi.scanline * surface->gdi.height * 1ULL;
+ 	surface->gdi.data = (BYTE*)_aligned_malloc(size, 16);
+ 
+ 	if (!surface->gdi.data)
+@@ -312,7 +312,7 @@ static UINT xf_CreateSurface(RdpgfxClientContext* context,
+ 		UINT32 bytes = GetBytesPerPixel(gdi->dstFormat);
+ 		surface->stageScanline = width * bytes;
+ 		surface->stageScanline = x11_pad_scanline(surface->stageScanline, xfc->scanline_pad);
+-		size = surface->stageScanline * surface->gdi.height;
++		size = surface->stageScanline * surface->gdi.height * 1ULL;
+ 		surface->stage = (BYTE*)_aligned_malloc(size, 16);
+ 
+ 		if (!surface->stage)
+diff --git a/client/X11/xf_graphics.c b/client/X11/xf_graphics.c
+index 1700092f8..8de32c557 100644
+--- a/client/X11/xf_graphics.c
++++ b/client/X11/xf_graphics.c
+@@ -125,7 +125,7 @@ static BOOL xf_Bitmap_New(rdpContext* context, rdpBitmap* bitmap)
+ 
+ 		if ((INT64)depth != xfc->depth)
+ 		{
+-			if (!(data = _aligned_malloc(bitmap->width * bitmap->height * 4, 16)))
++			if (!(data = _aligned_malloc(bitmap->width * bitmap->height * 4ULL, 16)))
+ 				goto unlock;
+ 
+ 			if (!freerdp_image_copy(data, gdi->dstFormat, 0, 0, 0, bitmap->width, bitmap->height,
+@@ -304,7 +304,7 @@ static BOOL _xf_Pointer_GetCursorForCurrentScale(rdpContext* context, const rdpP
+ 		ci.height = yTargetSize;
+ 		ci.xhot = pointer->xPos * xscale;
+ 		ci.yhot = pointer->yPos * yscale;
+-		size = ci.height * ci.width * GetBytesPerPixel(CursorFormat);
++		size = ci.height * ci.width * GetBytesPerPixel(CursorFormat) * 1ULL;
+ 
+ 		if (xscale != 1 || yscale != 1)
+ 		{
+@@ -391,7 +391,7 @@ static BOOL xf_Pointer_New(rdpContext* context, rdpPointer* pointer)
+ 	xpointer->nCursors = 0;
+ 	xpointer->mCursors = 0;
+ 
+-	size = pointer->height * pointer->width * GetBytesPerPixel(CursorFormat);
++	size = pointer->height * pointer->width * GetBytesPerPixel(CursorFormat) * 1ULL;
+ 
+ 	if (!(xpointer->cursorPixels = (XcursorPixel*)_aligned_malloc(size, 16)))
+ 		return FALSE;
+diff --git a/client/X11/xf_rail.c b/client/X11/xf_rail.c
+index 59d30b355..770234f7d 100644
+--- a/client/X11/xf_rail.c
++++ b/client/X11/xf_rail.c
+@@ -532,7 +532,7 @@ static xfRailIconCache* RailIconCache_New(rdpSettings* settings)
+ 
+ 	cache->numCaches = settings->RemoteAppNumIconCaches;
+ 	cache->numCacheEntries = settings->RemoteAppNumIconCacheEntries;
+-	cache->entries = calloc(cache->numCaches * cache->numCacheEntries, sizeof(xfRailIcon));
++	cache->entries = calloc(cache->numCaches * cache->numCacheEntries * 1ULL, sizeof(xfRailIcon));
+ 
+ 	if (!cache->entries)
+ 	{
+@@ -602,7 +602,7 @@ static BOOL convert_rail_icon(const ICON_INFO* iconInfo, xfRailIcon* railIcon)
+ 	long* pixels;
+ 	int i;
+ 	int nelements;
+-	argbPixels = calloc(iconInfo->width * iconInfo->height, 4);
++	argbPixels = calloc(iconInfo->width * iconInfo->height * 1ULL, 4);
+ 
+ 	if (!argbPixels)
+ 		goto error;
+diff --git a/libfreerdp/codec/clear.c b/libfreerdp/codec/clear.c
+index 083f1aa97..fadd98e67 100644
+--- a/libfreerdp/codec/clear.c
++++ b/libfreerdp/codec/clear.c
+@@ -566,7 +566,7 @@ static BOOL resize_vbar_entry(CLEAR_CONTEXT* clear, CLEAR_VBAR_ENTRY* vBarEntry)
+ 		const UINT32 diffSize = (vBarEntry->count - vBarEntry->size) * bpp;
+ 		BYTE* tmp;
+ 		vBarEntry->size = vBarEntry->count;
+-		tmp = (BYTE*)realloc(vBarEntry->pixels, vBarEntry->count * bpp);
++		tmp = (BYTE*)realloc(vBarEntry->pixels, vBarEntry->count * bpp * 1ULL);
+ 
+ 		if (!tmp)
+ 		{
+@@ -980,7 +980,7 @@ static BOOL clear_decompress_glyph_data(CLEAR_CONTEXT* clear, wStream* s, UINT32
+ 		if (glyphEntry->count > glyphEntry->size)
+ 		{
+ 			BYTE* tmp;
+-			tmp = realloc(glyphEntry->pixels, glyphEntry->count * bpp);
++			tmp = realloc(glyphEntry->pixels, glyphEntry->count * bpp * 1ULL);
+ 
+ 			if (!tmp)
+ 			{
+diff --git a/libfreerdp/codec/color.c b/libfreerdp/codec/color.c
+index a0fce37ef..edbfcd4ed 100644
+--- a/libfreerdp/codec/color.c
++++ b/libfreerdp/codec/color.c
+@@ -56,7 +56,7 @@ BYTE* freerdp_glyph_convert(UINT32 width, UINT32 height, const BYTE* data)
+ 	 * means of accessing individual pixels in blitting operations
+ 	 */
+ 	scanline = (width + 7) / 8;
+-	dstData = (BYTE*)_aligned_malloc(width * height, 16);
++	dstData = (BYTE*)_aligned_malloc(width * height * 1ULL, 16);
+ 
+ 	if (!dstData)
+ 		return NULL;
+@@ -545,7 +545,7 @@ BOOL freerdp_image_copy_from_pointer_data(BYTE* pDstData, UINT32 DstFormat, UINT
+ 	for (y = nYDst; y < nHeight; y++)
+ 	{
+ 		BYTE* pDstLine = &pDstData[y * nDstStep + nXDst * dstBytesPerPixel];
+-		memset(pDstLine, 0, dstBytesPerPixel * (nWidth - nXDst));
++		memset(pDstLine, 0, dstBytesPerPixel * (nWidth - nXDst) * 1ULL);
+ 	}
+ 
+ 	switch (xorBpp)
+@@ -742,7 +742,7 @@ BOOL freerdp_image_fill(BYTE* pDstData, DWORD DstFormat, UINT32 nDstStep, UINT32
+ 	for (y = 1; y < nHeight; y++)
+ 	{
+ 		BYTE* pDstLine = &pDstData[(y + nYDst) * nDstStep + nXDst * bpp];
+-		memcpy(pDstLine, pFirstDstLineXOffset, nWidth * bpp);
++		memcpy(pDstLine, pFirstDstLineXOffset, nWidth * bpp * 1ULL);
+ 	}
+ 
+ 	return TRUE;
+diff --git a/libfreerdp/codec/h264.c b/libfreerdp/codec/h264.c
+index 8756c5838..00b812b29 100644
+--- a/libfreerdp/codec/h264.c
++++ b/libfreerdp/codec/h264.c
+@@ -63,9 +63,9 @@ BOOL avc420_ensure_buffer(H264_CONTEXT* h264, UINT32 stride, UINT32 width, UINT3
+ 		_aligned_free(h264->pYUVData[0]);
+ 		_aligned_free(h264->pYUVData[1]);
+ 		_aligned_free(h264->pYUVData[2]);
+-		h264->pYUVData[0] = _aligned_malloc(h264->iStride[0] * height, 16);
+-		h264->pYUVData[1] = _aligned_malloc(h264->iStride[1] * height, 16);
+-		h264->pYUVData[2] = _aligned_malloc(h264->iStride[2] * height, 16);
++		h264->pYUVData[0] = _aligned_malloc(h264->iStride[0] * height * 1ULL, 16);
++		h264->pYUVData[1] = _aligned_malloc(h264->iStride[1] * height * 1ULL, 16);
++		h264->pYUVData[2] = _aligned_malloc(h264->iStride[2] * height * 1ULL, 16);
+ 
+ 		if (!h264->pYUVData[0] || !h264->pYUVData[1] || !h264->pYUVData[2])
+ 			return FALSE;
+diff --git a/libfreerdp/codec/nsc_encode.c b/libfreerdp/codec/nsc_encode.c
+index 501558c1c..fd9626a6d 100644
+--- a/libfreerdp/codec/nsc_encode.c
++++ b/libfreerdp/codec/nsc_encode.c
+@@ -273,8 +273,7 @@ static BOOL nsc_encode_argb_to_aycocg(NSC_CONTEXT* context, const BYTE* data, UI
+ 
+ static BOOL nsc_encode_subsampling(NSC_CONTEXT* context)
+ {
+-	UINT16 x;
+-	UINT16 y;
++	UINT32 y;
+ 	UINT32 tempWidth;
+ 	UINT32 tempHeight;
+ 
+@@ -292,6 +291,7 @@ static BOOL nsc_encode_subsampling(NSC_CONTEXT* context)
+ 
+ 	for (y = 0; y<tempHeight>> 1; y++)
+ 	{
++		UINT32 x;
+ 		BYTE* co_dst = context->priv->PlaneBuffers[1] + y * (tempWidth >> 1);
+ 		BYTE* cg_dst = context->priv->PlaneBuffers[2] + y * (tempWidth >> 1);
+ 		const INT8* co_src0 = (INT8*)context->priv->PlaneBuffers[1] + (y << 1) * tempWidth;
+diff --git a/libfreerdp/codec/nsc_sse2.c b/libfreerdp/codec/nsc_sse2.c
+index 3e393c902..7f101652d 100644
+--- a/libfreerdp/codec/nsc_sse2.c
++++ b/libfreerdp/codec/nsc_sse2.c
+@@ -320,8 +320,7 @@ static BOOL nsc_encode_argb_to_aycocg_sse2(NSC_CONTEXT* context, const BYTE* dat
+ 
+ static void nsc_encode_subsampling_sse2(NSC_CONTEXT* context)
+ {
+-	UINT16 x;
+-	UINT16 y;
++	UINT32 y;
+ 	BYTE* co_dst;
+ 	BYTE* cg_dst;
+ 	INT8* co_src0;
+@@ -338,6 +337,7 @@ static void nsc_encode_subsampling_sse2(NSC_CONTEXT* context)
+ 
+ 	for (y = 0; y<tempHeight>> 1; y++)
+ 	{
++		UINT32 x;
+ 		co_dst = context->priv->PlaneBuffers[1] + y * (tempWidth >> 1);
+ 		cg_dst = context->priv->PlaneBuffers[2] + y * (tempWidth >> 1);
+ 		co_src0 = (INT8*)context->priv->PlaneBuffers[1] + (y << 1) * tempWidth;
+diff --git a/libfreerdp/codec/progressive.c b/libfreerdp/codec/progressive.c
+index 8ef0b9081..8e7a49d5f 100644
+--- a/libfreerdp/codec/progressive.c
++++ b/libfreerdp/codec/progressive.c
+@@ -411,7 +411,7 @@ static INLINE BOOL progressive_tile_allocate(RFX_PROGRESSIVE_TILE* tile)
+ 	tile->stride = 4 * tile->width;
+ 
+ 	{
+-		size_t dataLen = tile->stride * tile->height;
++		size_t dataLen = tile->stride * tile->height * 1ULL;
+ 		tile->data = (BYTE*)_aligned_malloc(dataLen, 16);
+ 	}
+ 
+@@ -2299,7 +2299,7 @@ INT32 progressive_decompress_ex(PROGRESSIVE_CONTEXT* progressive, const BYTE* pS
+ 
+ 	for (i = 0; i < surface->numUpdatedTiles; i++)
+ 	{
+-		UINT32 nbUpdateRects;
++		UINT32 nbUpdateRects, j;
+ 		const RECTANGLE_16* updateRects;
+ 		RECTANGLE_16 updateRect;
+ 		RFX_PROGRESSIVE_TILE* tile = &surface->tiles[surface->updatedTileIndices[i]];
+diff --git a/libfreerdp/core/gcc.c b/libfreerdp/core/gcc.c
+index 06536dc06..52787ad70 100644
+--- a/libfreerdp/core/gcc.c
++++ b/libfreerdp/core/gcc.c
+@@ -35,8 +35,8 @@
+ 
+ static BOOL gcc_read_client_cluster_data(wStream* s, rdpMcs* mcs, UINT16 blockLength);
+ static BOOL gcc_read_client_core_data(wStream* s, rdpMcs* mcs, UINT16 blockLength);
+-static BOOL gcc_read_client_data_blocks(wStream* s, rdpMcs* mcs, int length);
+-static BOOL gcc_read_server_data_blocks(wStream* s, rdpMcs* mcs, int length);
++static BOOL gcc_read_client_data_blocks(wStream* s, rdpMcs* mcs, UINT16 length);
++static BOOL gcc_read_server_data_blocks(wStream* s, rdpMcs* mcs, UINT16 length);
+ static BOOL gcc_read_user_data_header(wStream* s, UINT16* type, UINT16* length);
+ static void gcc_write_user_data_header(wStream* s, UINT16 type, UINT16 length);
+ 
+@@ -379,7 +379,7 @@ void gcc_write_conference_create_response(wStream* s, wStream* userData)
+ 	                       0); /* array of server data blocks */
+ }
+ 
+-BOOL gcc_read_client_data_blocks(wStream* s, rdpMcs* mcs, int length)
++BOOL gcc_read_client_data_blocks(wStream* s, rdpMcs* mcs, UINT16 length)
+ {
+ 	UINT16 type;
+ 	UINT16 blockLength;
+@@ -518,7 +518,7 @@ BOOL gcc_write_client_data_blocks(wStream* s, rdpMcs* mcs)
+ 	return TRUE;
+ }
+ 
+-BOOL gcc_read_server_data_blocks(wStream* s, rdpMcs* mcs, int length)
++BOOL gcc_read_server_data_blocks(wStream* s, rdpMcs* mcs, UINT16 length)
+ {
+ 	UINT16 type;
+ 	UINT16 offset = 0;
+diff --git a/libfreerdp/gdi/bitmap.c b/libfreerdp/gdi/bitmap.c
+index 902cb50a0..8fde46556 100644
+--- a/libfreerdp/gdi/bitmap.c
++++ b/libfreerdp/gdi/bitmap.c
+@@ -147,7 +147,8 @@ HGDI_BITMAP gdi_CreateCompatibleBitmap(HGDI_DC hdc, UINT32 nWidth, UINT32 nHeigh
+ 	hBitmap->format = hdc->format;
+ 	hBitmap->width = nWidth;
+ 	hBitmap->height = nHeight;
+-	hBitmap->data = _aligned_malloc(nWidth * nHeight * GetBytesPerPixel(hBitmap->format), 16);
++	hBitmap->data =
++	    _aligned_malloc(nWidth * nHeight * GetBytesPerPixel(hBitmap->format) * 1ULL, 16);
+ 	hBitmap->free = _aligned_free;
+ 
+ 	if (!hBitmap->data)
+diff --git a/libfreerdp/gdi/gdi.c b/libfreerdp/gdi/gdi.c
+index b624e1174..5ca905b01 100644
+--- a/libfreerdp/gdi/gdi.c
++++ b/libfreerdp/gdi/gdi.c
+@@ -1057,7 +1057,7 @@ static BOOL gdi_surface_bits(rdpContext* context, const SURFACE_BITS_COMMAND* cm
+ 
+ 		case RDP_CODEC_ID_NONE:
+ 			format = gdi_get_pixel_format(cmd->bmp.bpp);
+-			size = cmd->bmp.width * cmd->bmp.height * GetBytesPerPixel(format);
++			size = cmd->bmp.width * cmd->bmp.height * GetBytesPerPixel(format) * 1ULL;
+ 			if (size > cmd->bmp.bitmapDataLength)
+ 			{
+ 				WLog_ERR(TAG, "Short nocodec message: got %" PRIu32 " bytes, require %" PRIuz,
+diff --git a/libfreerdp/gdi/gfx.c b/libfreerdp/gdi/gfx.c
+index 2221cc3f7..a3b7505c5 100644
+--- a/libfreerdp/gdi/gfx.c
++++ b/libfreerdp/gdi/gfx.c
+@@ -726,7 +726,7 @@ static UINT gdi_SurfaceCommand_Alpha(rdpGdi* gdi, RdpgfxClientContext* context,
+ 	{
+ 		UINT32 x, y;
+ 
+-		if (Stream_GetRemainingLength(&s) < cmd->height * cmd->width)
++		if (Stream_GetRemainingLength(&s) < cmd->height * cmd->width * 1ULL)
+ 			return ERROR_INVALID_DATA;
+ 
+ 		for (y = cmd->top; y < cmd->top + cmd->height; y++)
+@@ -1024,8 +1024,8 @@ static UINT gdi_CreateSurface(RdpgfxClientContext* context,
+ 			goto fail;
+ 	}
+ 
+-	surface->scanline = gfx_align_scanline(surface->width * 4, 16);
+-	surface->data = (BYTE*)_aligned_malloc(surface->scanline * surface->height, 16);
++	surface->scanline = gfx_align_scanline(surface->width * 4UL, 16);
++	surface->data = (BYTE*)_aligned_malloc(surface->scanline * surface->height * 1ULL, 16);
+ 
+ 	if (!surface->data)
+ 	{
+diff --git a/libfreerdp/gdi/graphics.c b/libfreerdp/gdi/graphics.c
+index 3bcf3730d..c8b5fc913 100644
+--- a/libfreerdp/gdi/graphics.c
++++ b/libfreerdp/gdi/graphics.c
+@@ -52,7 +52,7 @@ HGDI_BITMAP gdi_create_bitmap(rdpGdi* gdi, UINT32 nWidth, UINT32 nHeight, UINT32
+ 		return NULL;
+ 
+ 	nDstStep = nWidth * GetBytesPerPixel(gdi->dstFormat);
+-	pDstData = _aligned_malloc(nHeight * nDstStep, 16);
++	pDstData = _aligned_malloc(nHeight * nDstStep * 1ULL, 16);
+ 
+ 	if (!pDstData)
+ 		return NULL;
+diff --git a/libfreerdp/gdi/shape.c b/libfreerdp/gdi/shape.c
+index 9d9ae4d80..6c45e0c92 100644
+--- a/libfreerdp/gdi/shape.c
++++ b/libfreerdp/gdi/shape.c
+@@ -158,7 +158,7 @@ BOOL gdi_FillRect(HGDI_DC hdc, const HGDI_RECT rect, HGDI_BRUSH hbr)
+ 			for (y = 1; y < nHeight; y++)
+ 			{
+ 				BYTE* dstp = gdi_get_bitmap_pointer(hdc, nXDest, nYDest + y);
+-				memcpy(dstp, srcp, nWidth * formatSize);
++				memcpy(dstp, srcp, nWidth * formatSize * 1ULL);
+ 			}
+ 
+ 			break;
+diff --git a/libfreerdp/gdi/video.c b/libfreerdp/gdi/video.c
+index a543cbecb..0e12c52e7 100644
+--- a/libfreerdp/gdi/video.c
++++ b/libfreerdp/gdi/video.c
+@@ -66,7 +66,7 @@ static VideoSurface* gdiVideoCreateSurface(VideoClientContext* video, BYTE* data
+ 	ret->base.w = width;
+ 	ret->base.h = height;
+ 	ret->scanline = width * bpp;
+-	ret->image = _aligned_malloc(ret->scanline * height, 16);
++	ret->image = _aligned_malloc(ret->scanline * height * 1ULL, 16);
+ 
+ 	if (!ret->image)
+ 	{
+diff --git a/libfreerdp/primitives/prim_copy.c b/libfreerdp/primitives/prim_copy.c
+index 03f1d7c8c..ae841d0c4 100644
+--- a/libfreerdp/primitives/prim_copy.c
++++ b/libfreerdp/primitives/prim_copy.c
+@@ -60,14 +60,14 @@ static BOOL memory_regions_overlap_2d(const BYTE* p1, int p1Step, int p1Size, co
+ 
+ 	if (p1m <= p2m)
+ 	{
+-		ULONG_PTR p1mEnd = p1m + (height - 1) * p1Step + width * p1Size;
++		ULONG_PTR p1mEnd = p1m + (height - 1) * p1Step * 1ULL + width * p1Size * 1ULL;
+ 
+ 		if (p1mEnd > p2m)
+ 			return TRUE;
+ 	}
+ 	else
+ 	{
+-		ULONG_PTR p2mEnd = p2m + (height - 1) * p2Step + width * p2Size;
++		ULONG_PTR p2mEnd = p2m + (height - 1) * p2Step * 1ULL + width * p2Size * 1ULL;
+ 
+ 		if (p2mEnd > p1m)
+ 			return TRUE;
+diff --git a/libfreerdp/primitives/primitives.c b/libfreerdp/primitives/primitives.c
+index a1cd7ea85..26c6338f6 100644
+--- a/libfreerdp/primitives/primitives.c
++++ b/libfreerdp/primitives/primitives.c
+@@ -157,7 +157,7 @@ static primitives_YUV_benchmark* primitives_YUV_benchmark_init(primitives_YUV_be
+ 		if (!buf)
+ 			goto fail;
+ 
+-		winpr_RAND(buf, roi->width * roi->height);
++		winpr_RAND(buf, roi->width * roi->height * 1ULL);
+ 		ret->steps[i] = roi->width;
+ 	}
+ 
+diff --git a/uwac/libuwac/uwac-window.c b/uwac/libuwac/uwac-window.c
+index 13a2c2e78..bf70af2f1 100644
+--- a/uwac/libuwac/uwac-window.c
++++ b/uwac/libuwac/uwac-window.c
+@@ -316,14 +316,14 @@ int UwacWindowShmAllocBuffers(UwacWindow* w, int nbuffers, int allocSize, uint32
+ 
+ 	w->buffers = newBuffers;
+ 	memset(w->buffers + w->nbuffers, 0, sizeof(UwacBuffer) * nbuffers);
+-	fd = uwac_create_anonymous_file(allocSize * nbuffers);
++	fd = uwac_create_anonymous_file(allocSize * nbuffers * 1ULL);
+ 
+ 	if (fd < 0)
+ 	{
+ 		return UWAC_ERROR_INTERNAL;
+ 	}
+ 
+-	data = mmap(NULL, allocSize * nbuffers, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
++	data = mmap(NULL, allocSize * nbuffers * 1ULL, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
+ 
+ 	if (data == MAP_FAILED)
+ 	{
+@@ -335,7 +335,7 @@ int UwacWindowShmAllocBuffers(UwacWindow* w, int nbuffers, int allocSize, uint32
+ 
+ 	if (!pool)
+ 	{
+-		munmap(data, allocSize * nbuffers);
++		munmap(data, allocSize * nbuffers * 1ULL);
+ 		ret = UWAC_ERROR_NOMEMORY;
+ 		goto error_mmap;
+ 	}
+@@ -755,7 +755,8 @@ UwacReturnCode UwacWindowSubmitBuffer(UwacWindow* window, bool copyContentForNex
+ 		return UWAC_ERROR_NOMEMORY;
+ 
+ 	if (copyContentForNextFrame)
+-		memcpy(nextDrawingBuffer->data, pendingBuffer->data, window->stride * window->height);
++		memcpy(nextDrawingBuffer->data, pendingBuffer->data,
++		       window->stride * window->height * 1ULL);
+ 
+ 	UwacSubmitBufferPtr(window, pendingBuffer);
+ 	return UWAC_SUCCESS;
+diff --git a/winpr/include/winpr/print.h b/winpr/include/winpr/print.h
+index 5adf0c445..d75ffdba5 100644
+--- a/winpr/include/winpr/print.h
++++ b/winpr/include/winpr/print.h
+@@ -40,7 +40,7 @@ extern "C"
+ 	WINPR_API void winpr_CArrayDump(const char* tag, UINT32 lvl, const BYTE* data, int length,
+ 	                                int width);
+ 
+-	WINPR_API char* winpr_BinToHexString(const BYTE* data, int length, BOOL space);
++	WINPR_API char* winpr_BinToHexString(const BYTE* data, size_t length, BOOL space);
+ 
+ 	WINPR_API int wprintfx(const char* fmt, ...);
+ 	WINPR_API int wvprintfx(const char* fmt, va_list args);
+diff --git a/winpr/libwinpr/utils/lodepng/lodepng.c b/winpr/libwinpr/utils/lodepng/lodepng.c
+index 87f85080e..89878e074 100644
+--- a/winpr/libwinpr/utils/lodepng/lodepng.c
++++ b/winpr/libwinpr/utils/lodepng/lodepng.c
+@@ -3026,7 +3026,7 @@ size_t lodepng_get_raw_size(unsigned w, unsigned h, const LodePNGColorMode* colo
+ /*in an idat chunk, each scanline is a multiple of 8 bits, unlike the lodepng output buffer*/
+ static size_t lodepng_get_raw_size_idat(unsigned w, unsigned h, const LodePNGColorMode* color)
+ {
+-	return h * ((w * lodepng_get_bpp(color) + 7) / 8);
++	return h * ((w * lodepng_get_bpp(color) + 7ULL) / 8ULL);
+ }
+ #endif /*LODEPNG_COMPILE_DECODER*/
+ #endif /*LODEPNG_COMPILE_PNG*/
+@@ -3814,7 +3814,7 @@ unsigned lodepng_convert(unsigned char* out, const unsigned char* in, LodePNGCol
+ {
+ 	size_t i;
+ 	ColorTree tree;
+-	size_t numpixels = w * h;
++	size_t numpixels = w * h * 1ULL;
+ 
+ 	if (lodepng_color_mode_equal(mode_out, mode_in))
+ 	{
+@@ -3917,7 +3917,7 @@ unsigned get_color_profile(LodePNGColorProfile* profile, const unsigned char* in
+ 	unsigned error = 0;
+ 	size_t i;
+ 	ColorTree tree;
+-	size_t numpixels = w * h;
++	size_t numpixels = w * h * 1ULL;
+ 
+ 	unsigned colored_done = lodepng_is_greyscale_type(mode) ? 1 : 0;
+ 	unsigned alpha_done = lodepng_can_have_alpha(mode) ? 0 : 1;
+@@ -4223,11 +4223,11 @@ static void Adam7_getpassvalues(unsigned passw[7], unsigned passh[7], size_t fil
+ 		/*if passw[i] is 0, it's 0 bytes, not 1 (no filtertype-byte)*/
+ 		filter_passstart[i + 1] =
+ 		    filter_passstart[i] +
+-		    ((passw[i] && passh[i]) ? passh[i] * (1 + (passw[i] * bpp + 7) / 8) : 0);
++		    ((passw[i] && passh[i]) ? passh[i] * (1ULL + (passw[i] * bpp + 7ULL) / 8ULL) : 0);
+ 		/*bits padded if needed to fill full byte at end of each scanline*/
+-		padded_passstart[i + 1] = padded_passstart[i] + passh[i] * ((passw[i] * bpp + 7) / 8);
++		padded_passstart[i + 1] = padded_passstart[i] + passh[i] * ((passw[i] * bpp + 7ULL) / 8ULL);
+ 		/*only padded at end of reduced image*/
+-		passstart[i + 1] = passstart[i] + (passh[i] * passw[i] * bpp + 7) / 8;
++		passstart[i + 1] = passstart[i] + (passh[i] * passw[i] * bpp + 7ULL) / 8ULL;
+ 	}
+ }
+ 
+@@ -4538,7 +4538,7 @@ static unsigned postProcessScanlines(unsigned char* out, unsigned char* in, unsi
+ 		if (bpp < 8 && w * bpp != ((w * bpp + 7) / 8) * 8)
+ 		{
+ 			CERROR_TRY_RETURN(unfilter(in, in, w, h, bpp));
+-			removePaddingBits(out, in, w * bpp, ((w * bpp + 7) / 8) * 8, h);
++			removePaddingBits(out, in, w * bpp * 1ULL, ((w * bpp + 7ULL) / 8ULL) * 8ULL, h);
+ 		}
+ 		/*we can immediatly filter into the out buffer, no other steps needed*/
+ 		else
+@@ -4563,8 +4563,9 @@ static unsigned postProcessScanlines(unsigned char* out, unsigned char* in, unsi
+ 				/*remove padding bits in scanlines; after this there still may be padding
+ 				bits between the different reduced images: each reduced image still starts nicely at
+ 				a byte*/
+-				removePaddingBits(&in[passstart[i]], &in[padded_passstart[i]], passw[i] * bpp,
+-				                  ((passw[i] * bpp + 7) / 8) * 8, passh[i]);
++				removePaddingBits(&in[passstart[i]], &in[padded_passstart[i]],
++				                  passw[i] * bpp * 1ULL, ((passw[i] * bpp + 7ULL) / 8ULL) * 8ULL,
++				                  passh[i]);
+ 			}
+ 		}
+ 
+@@ -6049,12 +6050,12 @@ static unsigned preProcessScanlines(unsigned char** out, size_t* outsize, const
+ 			/*non multiple of 8 bits per scanline, padding bits needed per scanline*/
+ 			if (bpp < 8 && w * bpp != ((w * bpp + 7) / 8) * 8)
+ 			{
+-				unsigned char* padded = (unsigned char*)calloc(h * ((w * bpp + 7) / 8), 1);
++				unsigned char* padded = (unsigned char*)calloc(h * ((w * bpp + 7ULL) / 8ULL), 1);
+ 				if (!padded)
+ 					error = 83; /*alloc fail*/
+ 				if (!error)
+ 				{
+-					addPaddingBits(padded, in, ((w * bpp + 7) / 8) * 8, w * bpp, h);
++					addPaddingBits(padded, in, ((w * bpp + 7ULL) / 8ULL) * 8ULL, w * bpp * 1ULL, h);
+ 					error = filter(*out, padded, w, h, &info_png->color, settings);
+ 				}
+ 				free(padded);
+@@ -6097,8 +6098,9 @@ static unsigned preProcessScanlines(unsigned char** out, size_t* outsize, const
+ 					    padded_passstart[i + 1] - padded_passstart[i], sizeof(unsigned char));
+ 					if (!padded)
+ 						ERROR_BREAK(83); /*alloc fail*/
+-					addPaddingBits(padded, &adam7[passstart[i]], ((passw[i] * bpp + 7) / 8) * 8,
+-					               passw[i] * bpp, passh[i]);
++					addPaddingBits(padded, &adam7[passstart[i]],
++					               ((passw[i] * bpp + 7ULL) / 8ULL) * 8ULL, passw[i] * bpp * 1ULL,
++					               passh[i] * 1ULL);
+ 					error = filter(&(*out)[filter_passstart[i]], padded, passw[i], passh[i],
+ 					               &info_png->color, settings);
+ 					free(padded);
+diff --git a/winpr/libwinpr/utils/print.c b/winpr/libwinpr/utils/print.c
+index c56cf5f6f..e3257b146 100644
+--- a/winpr/libwinpr/utils/print.c
++++ b/winpr/libwinpr/utils/print.c
+@@ -158,23 +158,22 @@ void winpr_CArrayDump(const char* tag, UINT32 level, const BYTE* data, int lengt
+ 	free(buffer);
+ }
+ 
+-char* winpr_BinToHexString(const BYTE* data, int length, BOOL space)
++char* winpr_BinToHexString(const BYTE* data, size_t length, BOOL space)
+ {
+-	int i;
++	size_t i;
+ 	int n;
+ 	char* p;
+-	int ln, hn;
+-	char bin2hex[] = "0123456789ABCDEF";
++	const char bin2hex[] = "0123456789ABCDEF";
+ 	n = space ? 3 : 2;
+-	p = (char*)malloc((length + 1) * n);
++	p = (char*)malloc((length + 1ULL) * n);
+ 
+ 	if (!p)
+ 		return NULL;
+ 
+ 	for (i = 0; i < length; i++)
+ 	{
+-		ln = data[i] & 0xF;
+-		hn = (data[i] >> 4) & 0xF;
++		int ln = data[i] & 0xF;
++		int hn = (data[i] >> 4) & 0xF;
+ 		p[i * n] = bin2hex[hn];
+ 		p[(i * n) + 1] = bin2hex[ln];
+ 
+-- 
+2.30.2
+
diff -Nru freerdp2-2.3.0+dfsg1/debian/patches/0033-Reverted-winpr_BinToHexString-argument-change.patch freerdp2-2.3.0+dfsg1/debian/patches/0033-Reverted-winpr_BinToHexString-argument-change.patch
--- freerdp2-2.3.0+dfsg1/debian/patches/0033-Reverted-winpr_BinToHexString-argument-change.patch	1970-01-01 01:00:00.000000000 +0100
+++ freerdp2-2.3.0+dfsg1/debian/patches/0033-Reverted-winpr_BinToHexString-argument-change.patch	2021-04-29 11:55:48.000000000 +0200
@@ -0,0 +1,40 @@
+From bed161ce5081b1aae422beef9ca5722eba022280 Mon Sep 17 00:00:00 2001
+From: Armin Novak <armin.novak@thincast.com>
+Date: Fri, 12 Mar 2021 12:24:42 +0100
+Subject: [PATCH 33/36] Reverted winpr_BinToHexString argument change
+
+keep API compatible.
+---
+ winpr/include/winpr/print.h  | 2 +-
+ winpr/libwinpr/utils/print.c | 2 +-
+ 2 files changed, 2 insertions(+), 2 deletions(-)
+
+diff --git a/winpr/include/winpr/print.h b/winpr/include/winpr/print.h
+index d75ffdba5..5adf0c445 100644
+--- a/winpr/include/winpr/print.h
++++ b/winpr/include/winpr/print.h
+@@ -40,7 +40,7 @@ extern "C"
+ 	WINPR_API void winpr_CArrayDump(const char* tag, UINT32 lvl, const BYTE* data, int length,
+ 	                                int width);
+ 
+-	WINPR_API char* winpr_BinToHexString(const BYTE* data, size_t length, BOOL space);
++	WINPR_API char* winpr_BinToHexString(const BYTE* data, int length, BOOL space);
+ 
+ 	WINPR_API int wprintfx(const char* fmt, ...);
+ 	WINPR_API int wvprintfx(const char* fmt, va_list args);
+diff --git a/winpr/libwinpr/utils/print.c b/winpr/libwinpr/utils/print.c
+index e3257b146..1ab074a1c 100644
+--- a/winpr/libwinpr/utils/print.c
++++ b/winpr/libwinpr/utils/print.c
+@@ -158,7 +158,7 @@ void winpr_CArrayDump(const char* tag, UINT32 level, const BYTE* data, int lengt
+ 	free(buffer);
+ }
+ 
+-char* winpr_BinToHexString(const BYTE* data, size_t length, BOOL space)
++char* winpr_BinToHexString(const BYTE* data, int length, BOOL space)
+ {
+ 	size_t i;
+ 	int n;
+-- 
+2.30.2
+
diff -Nru freerdp2-2.3.0+dfsg1/debian/patches/0034-Fixed-6938-Remote-app-mode-clipboard-fix.patch freerdp2-2.3.0+dfsg1/debian/patches/0034-Fixed-6938-Remote-app-mode-clipboard-fix.patch
--- freerdp2-2.3.0+dfsg1/debian/patches/0034-Fixed-6938-Remote-app-mode-clipboard-fix.patch	1970-01-01 01:00:00.000000000 +0100
+++ freerdp2-2.3.0+dfsg1/debian/patches/0034-Fixed-6938-Remote-app-mode-clipboard-fix.patch	2021-05-16 23:30:49.000000000 +0200
@@ -0,0 +1,32 @@
+From f3aa8251145fe1bd917aebd3b9e0ab65d396e78e Mon Sep 17 00:00:00 2001
+From: akallabeth <akallabeth@posteo.net>
+Date: Fri, 16 Apr 2021 10:50:08 +0200
+Subject: [PATCH] Fixed #6938: Remote app mode clipboard fix
+
+In remote app mode the _FREERDP_TIMESTAMP_PROPERTY does not work.
+Therefore ignore it
+
+(cherry picked from commit f2254f0b09a5fbc424ef3876cb47b03d83963c38)
+---
+ client/X11/xf_cliprdr.c | 5 ++++-
+ 1 file changed, 4 insertions(+), 1 deletion(-)
+
+diff --git a/client/X11/xf_cliprdr.c b/client/X11/xf_cliprdr.c
+index 0e6cd036f..4b22edd38 100644
+--- a/client/X11/xf_cliprdr.c
++++ b/client/X11/xf_cliprdr.c
+@@ -1423,7 +1423,10 @@ static UINT xf_cliprdr_server_format_list(CliprdrClientContext* context,
+ 	}
+ 
+ 	ret = xf_cliprdr_send_client_format_list_response(clipboard, TRUE);
+-	xf_cliprdr_prepare_to_set_selection_owner(xfc, clipboard);
++	if (xfc->remote_app)
++		xf_cliprdr_set_selection_owner(xfc, clipboard, CurrentTime);
++	else
++		xf_cliprdr_prepare_to_set_selection_owner(xfc, clipboard);
+ 	return ret;
+ }
+ 
+-- 
+2.30.2
+
diff -Nru freerdp2-2.3.0+dfsg1/debian/patches/0035-Fixed-6989-Use-X509_STORE_set_default_paths.patch freerdp2-2.3.0+dfsg1/debian/patches/0035-Fixed-6989-Use-X509_STORE_set_default_paths.patch
--- freerdp2-2.3.0+dfsg1/debian/patches/0035-Fixed-6989-Use-X509_STORE_set_default_paths.patch	1970-01-01 01:00:00.000000000 +0100
+++ freerdp2-2.3.0+dfsg1/debian/patches/0035-Fixed-6989-Use-X509_STORE_set_default_paths.patch	2021-05-16 23:34:40.000000000 +0200
@@ -0,0 +1,28 @@
+From eaadeff1fc529f73d01a2a9699f840171c654e38 Mon Sep 17 00:00:00 2001
+From: akallabeth <akallabeth@posteo.net>
+Date: Mon, 3 May 2021 08:27:31 +0200
+Subject: [PATCH] Fixed #6989: Use X509_STORE_set_default_paths
+
+(cherry picked from commit b528ecde4f68d297b8464855a7ae0e02d36b78fc)
+---
+ libfreerdp/crypto/crypto.c | 4 +---
+ 1 file changed, 1 insertion(+), 3 deletions(-)
+
+diff --git a/libfreerdp/crypto/crypto.c b/libfreerdp/crypto/crypto.c
+index e61bd3bf1..82df956c2 100644
+--- a/libfreerdp/crypto/crypto.c
++++ b/libfreerdp/crypto/crypto.c
+@@ -846,9 +846,7 @@ BOOL x509_verify_certificate(CryptoCert cert, const char* certificate_store_path
+ 	                    NULL);
+ #endif
+ 
+-	lookup = X509_STORE_add_lookup(cert_ctx, X509_LOOKUP_file());
+-
+-	if (lookup == NULL)
++	if (X509_STORE_set_default_paths(cert_ctx) != 1)
+ 		goto end;
+ 
+ 	lookup = X509_STORE_add_lookup(cert_ctx, X509_LOOKUP_hash_dir());
+-- 
+2.30.2
+
diff -Nru freerdp2-2.3.0+dfsg1/debian/patches/2002_revert-e4b30a5cb6100a8ea4f320b829c9c5712ed4a783.patch freerdp2-2.3.0+dfsg1/debian/patches/2002_revert-e4b30a5cb6100a8ea4f320b829c9c5712ed4a783.patch
--- freerdp2-2.3.0+dfsg1/debian/patches/2002_revert-e4b30a5cb6100a8ea4f320b829c9c5712ed4a783.patch	2021-02-25 16:08:00.000000000 +0100
+++ freerdp2-2.3.0+dfsg1/debian/patches/2002_revert-e4b30a5cb6100a8ea4f320b829c9c5712ed4a783.patch	1970-01-01 01:00:00.000000000 +0100
@@ -1,166 +0,0 @@
-Description: This is a revert of upstream commit e4b30a5cb6100a8ea4f320b829c9c5712ed4a783 (breaking ABI compatibility with FreeRDP 2.2.0)
-Author: Mike Gabriel <mike.gabriel@das-netzwerkteam.de>
-
-#diff --git a/client/Mac/cli/AppDelegate.m b/client/Mac/cli/AppDelegate.m
-#index b7abcde70..698695676 100644
-#--- a/client/Mac/cli/AppDelegate.m
-#+++ b/client/Mac/cli/AppDelegate.m
-#@@ -199,7 +199,6 @@ void mac_set_view_size(rdpContext *context, MRDPView *view);
-# 
-# void AppDelegate_ConnectionResultEventHandler(void *ctx, ConnectionResultEventArgs *e)
-# {
-#-	rdpContext *context = (rdpContext *)ctx;
-# 	NSLog(@"ConnectionResult event result:%d\n", e->result);
-# 
-# 	if (_singleDelegate)
-#@@ -207,15 +206,11 @@ void AppDelegate_ConnectionResultEventHandler(void *ctx, ConnectionResultEventAr
-# 		if (e->result != 0)
-# 		{
-# 			NSString *message = nil;
-#-			DWORD code = freerdp_get_last_error(context);
-#-			switch (code)
-#+
-#+			if (connectErrorCode == AUTHENTICATIONERROR)
-# 			{
-#-				case FREERDP_ERROR_AUTHENTICATION_FAILED:
-#-					message = [NSString
-#-					    stringWithFormat:@"%@", @"Authentication failure, check credentials."];
-#-					break;
-#-				default:
-#-					break;
-#+				message = [NSString
-#+				    stringWithFormat:@"%@", @"Authentication failure, check credentials."];
-# 			}
-# 
-# 			// Making sure this should be invoked on the main UI thread.
-diff --git a/include/freerdp/error.h b/include/freerdp/error.h
-index 0fb51608b..f9d4b6ab0 100644
---- a/include/freerdp/error.h
-+++ b/include/freerdp/error.h
-@@ -177,6 +177,30 @@ extern "C"
- 	FREERDP_API const char* freerdp_get_error_info_name(UINT32 code);
- 	FREERDP_API const char* freerdp_get_error_info_category(UINT32 code);
- 
-+	/**
-+	 * This static variable holds an error code if the return value from connect is FALSE.
-+	 * This variable is always set to 0 in the beginning of the connect sequence.
-+	 * The returned code can be used to inform the user of the detailed connect error.
-+	 * The value can hold one of the defined error codes below OR an error according to errno
-+	 */
-+
-+	FREERDP_API extern int connectErrorCode;
-+
-+#define ERRORSTART 10000
-+#define PREECONNECTERROR ERRORSTART + 1
-+#define UNDEFINEDCONNECTERROR ERRORSTART + 2
-+#define POSTCONNECTERROR ERRORSTART + 3
-+#define DNSERROR ERRORSTART + 4        /* general DNS ERROR */
-+#define DNSNAMENOTFOUND ERRORSTART + 5 /* EAI_NONAME */
-+#define CONNECTERROR                                                            \
-+	ERRORSTART + 6 /* a connect error if errno is not define during tcp connect \
-+	                */
-+#define MCSCONNECTINITIALERROR ERRORSTART + 7
-+#define TLSCONNECTERROR ERRORSTART + 8
-+#define AUTHENTICATIONERROR ERRORSTART + 9
-+#define INSUFFICIENTPRIVILEGESERROR ERRORSTART + 10
-+#define CANCELEDBYUSER ERRORSTART + 11
-+
- 	/**
- 	 * FreeRDP Context Error Codes
- 	 */
-diff --git a/libfreerdp/core/errinfo.c b/libfreerdp/core/errinfo.c
-index abfe96efd..e635847dc 100644
---- a/libfreerdp/core/errinfo.c
-+++ b/libfreerdp/core/errinfo.c
-@@ -34,6 +34,8 @@
- 		ERRINFO_##_code, "ERRINFO_" #_code, ERRINFO_##_code##_STRING, category \
- 	}
- 
-+int connectErrorCode;
-+
- /* Protocol-independent codes */
- 
- #define ERRINFO_RPC_INITIATED_DISCONNECT_STRING \
-diff --git a/libfreerdp/core/freerdp.c b/libfreerdp/core/freerdp.c
-index 81183e76d..9094bc346 100644
---- a/libfreerdp/core/freerdp.c
-+++ b/libfreerdp/core/freerdp.c
-@@ -55,6 +55,8 @@
- 
- #define TAG FREERDP_TAG("core")
- 
-+/* connectErrorCode is 'extern' in error.h. See comment there.*/
-+
- UINT freerdp_channel_add_init_handle_data(rdpChannelHandles* handles, void* pInitHandle,
-                                           void* pUserData)
- {
-@@ -161,6 +163,7 @@ BOOL freerdp_connect(freerdp* instance)
- 
- 	/* We always set the return code to 0 before we start the connect sequence*/
- 	instance->ConnectionCallbackState = CLIENT_STATE_INITIAL;
-+	connectErrorCode = 0;
- 	freerdp_set_last_error_log(instance->context, FREERDP_ERROR_SUCCESS);
- 	clearChannelError(instance->context);
- 	ResetEvent(instance->context->abortEvent);
-@@ -890,6 +893,61 @@ void freerdp_set_last_error_ex(rdpContext* context, UINT32 lastError, const char
- 	}
- 
- 	context->LastError = lastError;
-+
-+	switch (lastError)
-+	{
-+		case FREERDP_ERROR_PRE_CONNECT_FAILED:
-+			connectErrorCode = PREECONNECTERROR;
-+			break;
-+
-+		case FREERDP_ERROR_CONNECT_UNDEFINED:
-+			connectErrorCode = UNDEFINEDCONNECTERROR;
-+			break;
-+
-+		case FREERDP_ERROR_POST_CONNECT_FAILED:
-+			connectErrorCode = POSTCONNECTERROR;
-+			break;
-+
-+		case FREERDP_ERROR_DNS_ERROR:
-+			connectErrorCode = DNSERROR;
-+			break;
-+
-+		case FREERDP_ERROR_DNS_NAME_NOT_FOUND:
-+			connectErrorCode = DNSNAMENOTFOUND;
-+			break;
-+
-+		case FREERDP_ERROR_CONNECT_FAILED:
-+			connectErrorCode = CONNECTERROR;
-+			break;
-+
-+		case FREERDP_ERROR_MCS_CONNECT_INITIAL_ERROR:
-+			connectErrorCode = MCSCONNECTINITIALERROR;
-+			break;
-+
-+		case FREERDP_ERROR_TLS_CONNECT_FAILED:
-+			connectErrorCode = TLSCONNECTERROR;
-+			break;
-+
-+		case FREERDP_ERROR_AUTHENTICATION_FAILED:
-+			connectErrorCode = AUTHENTICATIONERROR;
-+			break;
-+
-+		case FREERDP_ERROR_INSUFFICIENT_PRIVILEGES:
-+			connectErrorCode = INSUFFICIENTPRIVILEGESERROR;
-+			break;
-+
-+		case FREERDP_ERROR_CONNECT_CANCELLED:
-+			connectErrorCode = CANCELEDBYUSER;
-+			break;
-+
-+		case FREERDP_ERROR_SECURITY_NEGO_CONNECT_FAILED:
-+			connectErrorCode = CONNECTERROR;
-+			break;
-+
-+		case FREERDP_ERROR_CONNECT_TRANSPORT_FAILED:
-+			connectErrorCode = CONNECTERROR;
-+			break;
-+	}
- }
- 
- const char* freerdp_get_logon_error_info_type(UINT32 type)
diff -Nru freerdp2-2.3.0+dfsg1/debian/patches/series freerdp2-2.3.0+dfsg1/debian/patches/series
--- freerdp2-2.3.0+dfsg1/debian/patches/series	2021-02-25 16:07:13.000000000 +0100
+++ freerdp2-2.3.0+dfsg1/debian/patches/series	2021-05-16 23:35:05.000000000 +0200
@@ -1,2 +1,24 @@
 2001-fake-git-revision.patch
-2002_revert-e4b30a5cb6100a8ea4f320b829c9c5712ed4a783.patch
+0001-Added-compatibility-define.patch
+0003-Reverted-connectErrorCode-removal.patch
+0004-Fixed-a-leak-on-mouse-cursor-updates.patch
+0007-Fixed-format-string-in-smartcard_trace_state_return.patch
+0008-Fixed-linking-dependencies-for-client-geometry-chann.patch
+0010-Fixed-smartcard_convert_string_list-with-0-length.patch
+0012-Parse-on-a-copy-of-the-argument-string-for-printer.patch
+0015-Fix-xf_Pointer_SetPosition-with-smart-sizing.patch
+0017-Backported-6865-Disable-websockets-command-line-opti.patch
+0019-Check-smartcard_convert_string_list-for-NULL-string.patch
+0020-Use-specific-names-for-drive-hotplug-special-values.patch
+0021-Filter-RDPDR-types-other-than-drives-on-windows-hotp.patch
+0023-use-tlsOut-BIO-when-using-websocket-in-rdg_bio_ctrl.patch
+0024-Added-bounds-checks-to-gfx-commands.patch
+0025-Added-bounds-check-in-rdpgfx_recv_wire_to_surface_1_.patch
+0026-Added-fuzzying-test-for-planar-decoder.patch
+0027-Added-missing-bounds-check.patch
+0028-Fixed-mac-issues-with-smartcard-context-cleanup-6890.patch
+0031-Fix-monitor-list.patch
+0032-Fixed-CodeQL-warnings.patch
+0033-Reverted-winpr_BinToHexString-argument-change.patch
+0034-Fixed-6938-Remote-app-mode-clipboard-fix.patch
+0035-Fixed-6989-Use-X509_STORE_set_default_paths.patch
diff -Nru freerdp2-2.3.0+dfsg1/debian/watch freerdp2-2.3.0+dfsg1/debian/watch
--- freerdp2-2.3.0+dfsg1/debian/watch	2021-02-25 16:14:52.000000000 +0100
+++ freerdp2-2.3.0+dfsg1/debian/watch	2021-04-29 11:53:21.000000000 +0200
@@ -3,5 +3,5 @@
 filenamemangle=s/.*\/v?([\d\.-]+)\.tar\.gz/freerdp-$1.tar.gz/,\
 dversionmangle=s/\+dfsg1//,\
 repacksuffix=+dfsg1 \
-https://github.com/FreeRDP/FreeRDP/tags .*/archive/v?([\d\.]+).tar.gz \
+https://github.com/FreeRDP/FreeRDP/tags .*/archive/refs/tags/v?([\d\.]+).tar.gz \
 debian

--- End Message ---
--- Begin Message ---
Unblocked.

--- End Message ---

Reply to: