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_TRACE);
42 (void)WLog_SetLogAppenderType(WLog_GetRoot(), WLOG_APPENDER_CALLBACK);
43 loggingInitialized = TRUE;
44 }
45
46 if (size < 2)
47 return 0;
48 if (size > (1u << 20))
49 return 0;
50
51 wClipboard* clipboard = ClipboardCreate();
52 if (!clipboard)
53 return 0;
54
55 const size_t count = sizeof(kSourceFormats) / sizeof(kSourceFormats[0]);
56 const char* srcName = kSourceFormats[data[0] % count];
57
58 UINT32 srcId = ClipboardRegisterFormat(clipboard, srcName);
59 if (srcId != 0)
60 {
61 /* Store the remaining bytes as the (attacker) payload for srcName. */
62 (void)ClipboardSetData(clipboard, srcId, data + 1, (UINT32)(size - 1));
63
64 UINT32* formatIds = nullptr;
65 UINT32 numFormats = ClipboardGetFormatIds(clipboard, &formatIds);
66
67 for (UINT32 i = 0; i < numFormats; i++)
68 {
69 UINT32 outSize = 0;
70 void* out = ClipboardGetData(clipboard, formatIds[i], &outSize);
71 free(out);
72 }
73 free(formatIds);
74 }
75
76 ClipboardDestroy(clipboard);
77 return 0;
78}