From 169971607cece48384cb94632b829bd57336af0f Mon Sep 17 00:00:00 2001
From: Armin Novak <armin.novak@thincast.com>
Date: Tue, 17 Feb 2026 08:38:04 +0100
Subject: [PATCH] [codec,nsc] fix use of nsc_process_message

the second width/height argument should reflect the destination buffer
pixel size
---
 libfreerdp/codec/clear.c | 10 ++++++----
 libfreerdp/codec/nsc.c   | 12 +++++++-----
 libfreerdp/gdi/gdi.c     |  5 +++--
 3 files changed, 16 insertions(+), 11 deletions(-)

Index: freerdp-2.11.7/libfreerdp/codec/clear.c
===================================================================
--- freerdp-2.11.7.orig/libfreerdp/codec/clear.c
+++ freerdp-2.11.7/libfreerdp/codec/clear.c
@@ -103,7 +103,8 @@ static BOOL convert_color(BYTE* dst, UIN
 
 static BOOL clear_decompress_nscodec(NSC_CONTEXT* nsc, UINT32 width, UINT32 height, wStream* s,
                                      UINT32 bitmapDataByteCount, BYTE* pDstData, UINT32 DstFormat,
-                                     UINT32 nDstStep, UINT32 nXDstRel, UINT32 nYDstRel)
+                                     UINT32 nDstStep, UINT32 nXDstRel, UINT32 nYDstRel,
+                                     UINT32 nDstWidth, UINT32 nDstHeight)
 {
 	BOOL rc;
 
@@ -115,8 +116,8 @@ static BOOL clear_decompress_nscodec(NSC
 	}
 
 	rc = nsc_process_message(nsc, 32, width, height, Stream_Pointer(s), bitmapDataByteCount,
-	                         pDstData, DstFormat, nDstStep, nXDstRel, nYDstRel, width, height,
-	                         FREERDP_FLIP_NONE);
+	                         pDstData, DstFormat, nDstStep, nXDstRel, nYDstRel, nDstWidth,
+	                         nDstHeight, FREERDP_FLIP_NONE);
 	Stream_Seek(s, bitmapDataByteCount);
 	return rc;
 }
@@ -547,7 +548,8 @@ static BOOL clear_decompress_subcodecs_d
 
 			case 1: /* NSCodec */
 				if (!clear_decompress_nscodec(clear->nsc, width, height, s, bitmapDataByteCount,
-				                              pDstData, DstFormat, nDstStep, nXDstRel, nYDstRel))
+				                              pDstData, DstFormat, nDstStep, nXDstRel, nYDstRel,
+				                              nDstWidth, nDstHeight))
 					return FALSE;
 
 				break;
Index: freerdp-2.11.7/libfreerdp/gdi/gdi.c
===================================================================
--- freerdp-2.11.7.orig/libfreerdp/gdi/gdi.c
+++ freerdp-2.11.7/libfreerdp/gdi/gdi.c
@@ -1074,8 +1074,9 @@ static BOOL gdi_surface_bits(rdpContext*
 			if (!nsc_process_message(
 			        context->codecs->nsc, cmd->bmp.bpp, cmd->bmp.width, cmd->bmp.height,
 			        cmd->bmp.bitmapData, cmd->bmp.bitmapDataLength, gdi->primary_buffer, format,
-			        gdi->stride, cmdRect.left, cmdRect.top, cmdRect.right - cmdRect.left,
-			        cmdRect.bottom - cmdRect.top, FREERDP_FLIP_VERTICAL))
+			        gdi->stride, cmdRect.left, cmdRect.top,
+			        WINPR_ASSERTING_INT_CAST(UINT32, gdi->width),
+			        WINPR_ASSERTING_INT_CAST(UINT32, gdi->height), FREERDP_FLIP_VERTICAL))
 			{
 				WLog_ERR(TAG, "Failed to process NSCodec message");
 				goto out;
Index: freerdp-2.11.7/libfreerdp/codec/nsc.c
===================================================================
--- freerdp-2.11.7.orig/libfreerdp/codec/nsc.c
+++ freerdp-2.11.7/libfreerdp/codec/nsc.c
@@ -448,8 +448,17 @@ BOOL nsc_process_message(NSC_CONTEXT* co
 {
 	wStream* s;
 	BOOL ret;
+
+	WINPR_ASSERT(context);
+	WINPR_ASSERT(context->priv);
+
 	if (!context || !data || !pDstData)
+	if (!data || !pDstData)
+    {
+		WLog_Print(context->priv->log, WLOG_ERROR, "Invalid argument: data=%p, pDstData=%p",
+		           (const void*)data, (void*)pDstData);
 		return FALSE;
+    }
 
 	s = Stream_New((BYTE*)data, length);
 
