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
@@ -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
|