FreeRDP
Loading...
Searching...
No Matches
TestFuzzWinPRClipboard.c
1
16#include <stddef.h>
17#include <stdint.h>
18
19#include <winpr/crt.h>
20#include <winpr/clipboard.h>
21#include <winpr/wlog.h>
22
23static const char* kSourceFormats[] = { "CF_DIB",
24 "CF_DIBV5",
25 "HTML Format",
26 "text/html",
27 "image/bmp",
28 "image/png",
29 "FileGroupDescriptorW",
30 "text/uri-list",
31 "CF_UNICODETEXT",
32 "CF_TEXT",
33 "CF_OEMTEXT" };
34
35int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size)
36{
37 static BOOL loggingInitialized = FALSE;
38
39 if (!loggingInitialized)
40 {
41 (void)WLog_SetLogLevel(WLog_GetRoot(), WLOG_OFF);
42 loggingInitialized = TRUE;
43 }
44
45 if (size < 2)
46 return 0;
47 if (size > (1u << 20))
48 return 0;
49
50 wClipboard* clipboard = ClipboardCreate();
51 if (!clipboard)
52 return 0;
53
54 const size_t count = sizeof(kSourceFormats) / sizeof(kSourceFormats[0]);
55 const char* srcName = kSourceFormats[data[0] % count];
56
57 UINT32 srcId = ClipboardRegisterFormat(clipboard, srcName);
58 if (srcId != 0)
59 {
60 /* Store the remaining bytes as the (attacker) payload for srcName. */
61 (void)ClipboardSetData(clipboard, srcId, data + 1, (UINT32)(size - 1));
62
63 UINT32* formatIds = nullptr;
64 UINT32 numFormats = ClipboardGetFormatIds(clipboard, &formatIds);
65
66 for (UINT32 i = 0; i < numFormats; i++)
67 {
68 UINT32 outSize = 0;
69 void* out = ClipboardGetData(clipboard, formatIds[i], &outSize);
70 free(out);
71 }
72 free(formatIds);
73 }
74
75 ClipboardDestroy(clipboard);
76 return 0;
77}