10#include <winpr/stream.h>
11#include <winpr/wlog.h>
13#include <freerdp/channels/cliprdr.h>
15#include "../../cliprdr_common.h"
17static wLog* g_Log =
nullptr;
19static UINT32 fuzz_stream_len_u32(
wStream* s)
21 const size_t remaining = Stream_GetRemainingLength(s);
22 return (remaining > UINT32_MAX) ? UINT32_MAX : (UINT32)remaining;
25static void fuzz_format_list(
wStream* s, BOOL longNames)
28 list.common.dataLen = fuzz_stream_len_u32(s);
30 if (cliprdr_read_format_list(g_Log, s, &list, longNames) == CHANNEL_RC_OK)
31 cliprdr_free_format_list(&list);
34static void fuzz_format_data_request(
wStream* s)
37 request.common.dataLen = fuzz_stream_len_u32(s);
38 (void)cliprdr_read_format_data_request(s, &request);
41static void fuzz_format_data_response(
wStream* s)
44 response.common.dataLen = fuzz_stream_len_u32(s);
45 (void)cliprdr_read_format_data_response(s, &response);
48static void fuzz_file_contents_request(
wStream* s)
51 request.common.dataLen = fuzz_stream_len_u32(s);
52 (void)cliprdr_read_file_contents_request(s, &request);
55static void fuzz_file_contents_response(
wStream* s)
58 const UINT32 dataLen = fuzz_stream_len_u32(s);
60 response.common.dataLen = (dataLen >= 4) ? dataLen : 4;
61 (void)cliprdr_read_file_contents_response(s, &response);
64static void fuzz_unlock(
wStream* s)
67 data.common.dataLen = fuzz_stream_len_u32(s);
68 (void)cliprdr_read_unlock_clipdata(s, &data);
71int LLVMFuzzerTestOneInput(
const uint8_t* data,
size_t size)
75 if (size > (1u << 20))
79 g_Log = WLog_Get(
"fuzz.cliprdr");
81 BOOL longNames = (data[1] & 0x1) != 0;
82 const uint8_t* body = data + 2;
83 wStream* s = Stream_New((BYTE*)body, size - 2);
90 fuzz_format_list(s, longNames);
93 fuzz_format_data_request(s);
96 fuzz_format_data_response(s);
99 fuzz_file_contents_request(s);
102 fuzz_file_contents_response(s);
111 Stream_Free(s, FALSE);