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);
77struct test_peer_context
83typedef struct test_peer_context testPeerContext;
85static void test_peer_context_free(freerdp_peer* client, rdpContext* ctx)
87 testPeerContext* context = (testPeerContext*)ctx;
91 if (context && context->vcm)
93 WTSCloseServer(context->vcm);
98static BOOL test_peer_context_new(freerdp_peer* client, rdpContext* ctx)
100 testPeerContext* context = (testPeerContext*)ctx;
102 WINPR_ASSERT(client);
103 WINPR_ASSERT(context);
105 context->vcm = WTSOpenServerA((LPSTR)client->context);
106 if (!context->vcm || context->vcm == INVALID_HANDLE_VALUE)
111 test_peer_context_free(client, ctx);
115static BOOL test_server_one(
const char* fkey,
const char* fcert,
const uint8_t* Data,
size_t Size)
117 int sv[2] = WINPR_C_ARRAY_INIT;
119 if (socketpair(AF_UNIX, SOCK_STREAM, 0, sv) != 0)
122 freerdp_peer* client = freerdp_peer_new(sv[0]);
130 client->ContextSize =
sizeof(testPeerContext);
131 client->ContextNew = test_peer_context_new;
132 client->ContextFree = test_peer_context_free;
133 if (!freerdp_peer_context_new(client))
136 WINPR_ASSERT(client->context);
137 rdpSettings* settings = client->context->settings;
138 WINPR_ASSERT(settings);
140 rdpCertificate* cert = freerdp_certificate_new_from_file(fcert);
146 rdpPrivateKey* key = freerdp_key_new_from_file(fkey);
183 INITIATE_REQUEST_PROTOCOL_UDPFECR))
188 client->PostConnect = test_peer_post_connect;
189 client->Activate = test_peer_activate;
190 client->VirtualChannelRead = test_peer_virtual_channel_read;
198 client->local = TRUE;
199 if (!client->Initialize(client))
202 testPeerContext* context = (testPeerContext*)client->context;
203 WINPR_ASSERT(context);
206 if (fcntl(sv[1], F_SETFL, O_NONBLOCK) != 0)
211 while (written < Size)
213 const ssize_t rc = write(sv[1], Data + written, Size - written);
216 if (errno == EAGAIN || errno == EWOULDBLOCK || errno == EINTR)
220 written += (size_t)rc;
223 if (shutdown(sv[1], SHUT_WR) != 0)
231 for (
size_t i = 0; i < TEST_SERVER_MAX_ITERATIONS; i++)
233 if (!client->CheckFileDescriptor(client))
236 if (WTSVirtualChannelManagerCheckFileDescriptor(context->vcm) != TRUE)
239 char buffer[256] = WINPR_C_ARRAY_INIT;
243 rc = read(sv[1], buffer,
sizeof(buffer));
248 freerdp_peer_context_free(client);
249 freerdp_peer_free(client);
254int LLVMFuzzerTestOneInput(
const uint8_t* Data,
size_t Size)
256 const char* key = getTestCredentialsFileNameFor(
"crt");
257 const char* cert = getTestCredentialsFileNameFor(
"key");
261 if (WLog_SetLogLevel(WLog_GetRoot(), WLOG_OFF) &&
262 WTSRegisterWtsApiFunctionTable(FreeRDP_InitWtsApi()) &&
263 winpr_InitializeSSL(WINPR_SSL_INIT_DEFAULT))
265 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.