Package: freerdp2 / 2.3.0+dfsg1-2+deb11u1

0026-Added-fuzzying-test-for-planar-decoder.patch Patch series | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
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