25#include <freerdp/peer.h>
26#include <freerdp/freerdp.h>
28#include <freerdp/settings.h>
29#include <freerdp/constants.h>
30#include <freerdp/crypto/certificate.h>
31#include <freerdp/crypto/privatekey.h>
33#include <freerdp/channels/wtsvc.h>
34#include <freerdp/channels/channels.h>
36#include "../multitransport.h"
38#include <winpr/assert.h>
40#include <winpr/wlog.h>
43#error "WIN32 not supported, remove this file from compile!"
46#include <sys/socket.h>
51#define TEST_SERVER_MAX_ITERATIONS (1 << 20)
53#include "TestFuzzServerCerts.h"
55static BOOL test_peer_post_connect(freerdp_peer* peer)
61static BOOL test_peer_activate(freerdp_peer* peer)
67static int test_peer_virtual_channel_read(freerdp_peer* peer, HANDLE hChannel, BYTE* buffer,
71 WINPR_UNUSED(hChannel);
74 WINPR_ASSERT(buffer || (length == 0));
78struct test_peer_context
84typedef struct test_peer_context testPeerContext;
86static void test_peer_context_free(freerdp_peer* client, rdpContext* ctx)
88 testPeerContext* context = (testPeerContext*)ctx;
92 if (context && context->vcm)
94 WTSCloseServer(context->vcm);
95 context->vcm =
nullptr;
99static BOOL test_peer_context_new(freerdp_peer* client, rdpContext* ctx)
101 testPeerContext* context = (testPeerContext*)ctx;
103 WINPR_ASSERT(client);
104 WINPR_ASSERT(context);
106 context->vcm = WTSOpenServerA((LPSTR)client->context);
107 if (!context->vcm || context->vcm == INVALID_HANDLE_VALUE)
112 test_peer_context_free(client, ctx);
116static BOOL test_server_one(
const char* fkey,
const char* fcert,
const uint8_t* Data,
size_t Size)
118 int sv[2] = WINPR_C_ARRAY_INIT;
120 if (socketpair(AF_UNIX, SOCK_STREAM, 0, sv) != 0)
123 freerdp_peer* client = freerdp_peer_new(sv[0]);
131 client->ContextSize =
sizeof(testPeerContext);
132 client->ContextNew = test_peer_context_new;
133 client->ContextFree = test_peer_context_free;
134 if (!freerdp_peer_context_new(client))
137 WINPR_ASSERT(client->context);
138 rdpSettings* settings = client->context->settings;
139 WINPR_ASSERT(settings);
141 rdpCertificate* cert = freerdp_certificate_new_from_file(fcert);
147 rdpPrivateKey* key = freerdp_key_new_from_file(fkey);
184 INITIATE_REQUEST_PROTOCOL_UDPFECR))
189 client->PostConnect = test_peer_post_connect;
190 client->Activate = test_peer_activate;
191 client->VirtualChannelRead = test_peer_virtual_channel_read;
199 client->local = TRUE;
200 if (!client->Initialize(client))
203 testPeerContext* context = (testPeerContext*)client->context;
204 WINPR_ASSERT(context);
207 if (fcntl(sv[1], F_SETFL, O_NONBLOCK) != 0)
212 while (written < Size)
214 const ssize_t rc = write(sv[1], Data + written, Size - written);
217 if (errno == EAGAIN || errno == EWOULDBLOCK || errno == EINTR)
221 written += (size_t)rc;
224 if (shutdown(sv[1], SHUT_WR) != 0)
232 for (
size_t i = 0; i < TEST_SERVER_MAX_ITERATIONS; i++)
234 if (!client->CheckFileDescriptor(client))
237 if (WTSVirtualChannelManagerCheckFileDescriptor(context->vcm) != TRUE)
240 char buffer[256] = WINPR_C_ARRAY_INIT;
244 rc = read(sv[1], buffer,
sizeof(buffer));
249 freerdp_peer_context_free(client);
250 freerdp_peer_free(client);
255int LLVMFuzzerTestOneInput(
const uint8_t* Data,
size_t Size)
257 const char* key = getTestCredentialsFileNameFor(
"crt");
258 const char* cert = getTestCredentialsFileNameFor(
"key");
262 if (WLog_SetLogLevel(WLog_GetRoot(), WLOG_OFF) &&
263 WTSRegisterWtsApiFunctionTable(FreeRDP_InitWtsApi()) &&
264 winpr_InitializeSSL(WINPR_SSL_INIT_DEFAULT))
266 test_server_one(key, cert, Data, Size);
WINPR_ATTR_NODISCARD FREERDP_API BOOL freerdp_settings_set_bool(rdpSettings *settings, FreeRDP_Settings_Keys_Bool id, BOOL val)
Sets a BOOL settings value.
WINPR_ATTR_NODISCARD FREERDP_API BOOL freerdp_settings_set_uint32(rdpSettings *settings, FreeRDP_Settings_Keys_UInt32 id, UINT32 val)
Sets a UINT32 settings value.
WINPR_ATTR_NODISCARD FREERDP_API BOOL freerdp_settings_set_pointer_len(rdpSettings *settings, FreeRDP_Settings_Keys_Pointer id, const void *data, size_t len)
Set a pointer to value data.