Merge pull request #12135 from akallabeth/sanitize

Sanitizer fixes
This commit is contained in:
akallabeth
2026-01-13 17:37:01 +01:00
committed by GitHub
11 changed files with 88 additions and 58 deletions

View File

@@ -41,7 +41,7 @@ foreach(STATIC_ENTRY ${CHANNEL_STATIC_CLIENT_ENTRIES})
if(${ENTRY} STREQUAL "VirtualChannelEntry")
set(ENTRY_POINT_IMPORT "extern BOOL VCAPITYPE ${ENTRY_POINT_NAME}(PCHANNEL_ENTRY_POINTS);")
elseif(${ENTRY} STREQUAL "VirtualChannelEntryEx")
set(ENTRY_POINT_IMPORT "extern BOOL VCAPITYPE ${ENTRY_POINT_NAME}(PCHANNEL_ENTRY_POINTS,PVOID);")
set(ENTRY_POINT_IMPORT "extern BOOL VCAPITYPE ${ENTRY_POINT_NAME}(PCHANNEL_ENTRY_POINTS_EX,PVOID);")
elseif(${ENTRY} MATCHES "DVCPluginEntry$")
set(ENTRY_POINT_IMPORT "extern UINT VCAPITYPE ${ENTRY_POINT_NAME}(IDRDYNVC_ENTRY_POINTS* pEntryPoints);")
elseif(${ENTRY} MATCHES "DeviceServiceEntry$")

View File

@@ -43,7 +43,7 @@ typedef struct
static_entry_vc_fn_t entry;
} STATIC_ENTRY_VC;
typedef BOOL(VCAPITYPE* static_entry_vcex_fn_t)(PCHANNEL_ENTRY_POINTS, PVOID);
typedef BOOL(VCAPITYPE* static_entry_vcex_fn_t)(PCHANNEL_ENTRY_POINTS_EX, PVOID);
typedef struct
{
const char* name;

View File

@@ -1134,7 +1134,7 @@ static VOID VCAPITYPE cliprdr_virtual_channel_init_event_ex(LPVOID lpUserParam,
/* cliprdr is always built-in */
#define VirtualChannelEntryEx cliprdr_VirtualChannelEntryEx
FREERDP_ENTRY_POINT(BOOL VCAPITYPE VirtualChannelEntryEx(PCHANNEL_ENTRY_POINTS pEntryPoints,
FREERDP_ENTRY_POINT(BOOL VCAPITYPE VirtualChannelEntryEx(PCHANNEL_ENTRY_POINTS_EX pEntryPoints,
PVOID pInitHandle))
{
UINT rc = 0;

View File

@@ -36,6 +36,7 @@
#include <winpr/interlocked.h>
#include <winpr/file.h>
#include <winpr/path.h>
#include <winpr/print.h>
#include <freerdp/channels/rdpdr.h>
#include <freerdp/crypto/crypto.h>
@@ -77,12 +78,29 @@ typedef enum
static const char* filemap[] = { "PortDosName", "PnPName", "DriverName",
"CachedPrinterConfigData" };
WINPR_ATTR_MALLOC(free, 1)
static char* get_printer_hash(const WCHAR* name, size_t length)
{
BYTE hash[WINPR_SHA256_DIGEST_LENGTH] = { 0 };
if (!winpr_Digest(WINPR_MD_SHA256, name, length, hash, sizeof(hash)))
return NULL;
return winpr_BinToHexString(hash, sizeof(hash), FALSE);
}
WINPR_ATTR_MALLOC(free, 1)
static char* get_printer_config_path(const rdpSettings* settings, const WCHAR* name, size_t length)
{
char* config = NULL;
const char* path = freerdp_settings_get_string(settings, FreeRDP_ConfigPath);
char* dir = GetCombinedPath(path, "printers");
char* bname = crypto_base64_encode((const BYTE*)name, length);
char* config = GetCombinedPath(dir, bname);
if (!dir)
return NULL;
char* bname = get_printer_hash(name, length);
if (!bname)
goto fail;
config = GetCombinedPath(dir, bname);
if (config && !winpr_PathFileExists(config))
{
@@ -93,6 +111,7 @@ static char* get_printer_config_path(const rdpSettings* settings, const WCHAR* n
}
}
fail:
free(dir);
free(bname);
return config;
@@ -101,6 +120,9 @@ static char* get_printer_config_path(const rdpSettings* settings, const WCHAR* n
static BOOL printer_write_setting(const char* path, prn_conf_t type, const void* data,
size_t length)
{
if (!path)
return FALSE;
DWORD written = 0;
BOOL rc = FALSE;
HANDLE file = NULL;

View File

@@ -676,7 +676,7 @@ static VOID VCAPITYPE rail_virtual_channel_init_event_ex(LPVOID lpUserParam, LPV
/* rail is always built-in */
#define VirtualChannelEntryEx rail_VirtualChannelEntryEx
FREERDP_ENTRY_POINT(BOOL VCAPITYPE VirtualChannelEntryEx(PCHANNEL_ENTRY_POINTS pEntryPoints,
FREERDP_ENTRY_POINT(BOOL VCAPITYPE VirtualChannelEntryEx(PCHANNEL_ENTRY_POINTS_EX pEntryPoints,
PVOID pInitHandle))
{
UINT rc = 0;

View File

@@ -289,7 +289,7 @@ static VOID VCAPITYPE VirtualChannelInitEventEx(LPVOID lpUserParam, LPVOID pInit
}
#define VirtualChannelEntryEx rdp2tcp_VirtualChannelEntryEx
FREERDP_ENTRY_POINT(BOOL VCAPITYPE VirtualChannelEntryEx(PCHANNEL_ENTRY_POINTS pEntryPoints,
FREERDP_ENTRY_POINT(BOOL VCAPITYPE VirtualChannelEntryEx(PCHANNEL_ENTRY_POINTS_EX pEntryPoints,
PVOID pInitHandle))
{
CHANNEL_ENTRY_POINTS_FREERDP_EX* pEntryPointsEx =

View File

@@ -2420,17 +2420,13 @@ static VOID VCAPITYPE rdpdr_virtual_channel_init_event_ex(LPVOID lpUserParam, LP
/* rdpdr is always built-in */
#define VirtualChannelEntryEx rdpdr_VirtualChannelEntryEx
FREERDP_ENTRY_POINT(BOOL VCAPITYPE VirtualChannelEntryEx(PCHANNEL_ENTRY_POINTS pEntryPoints,
FREERDP_ENTRY_POINT(BOOL VCAPITYPE VirtualChannelEntryEx(PCHANNEL_ENTRY_POINTS_EX pEntryPoints,
PVOID pInitHandle))
{
UINT rc = 0;
rdpdrPlugin* rdpdr = NULL;
CHANNEL_ENTRY_POINTS_FREERDP_EX* pEntryPointsEx = NULL;
WINPR_ASSERT(pEntryPoints);
WINPR_ASSERT(pInitHandle);
rdpdr = (rdpdrPlugin*)calloc(1, sizeof(rdpdrPlugin));
rdpdrPlugin* rdpdr = (rdpdrPlugin*)calloc(1, sizeof(rdpdrPlugin));
if (!rdpdr)
{
@@ -2463,7 +2459,8 @@ FREERDP_ENTRY_POINT(BOOL VCAPITYPE VirtualChannelEntryEx(PCHANNEL_ENTRY_POINTS p
(void)sprintf_s(rdpdr->channelDef.name, ARRAYSIZE(rdpdr->channelDef.name),
RDPDR_SVC_CHANNEL_NAME);
rdpdr->sequenceId = 0;
pEntryPointsEx = (CHANNEL_ENTRY_POINTS_FREERDP_EX*)pEntryPoints;
CHANNEL_ENTRY_POINTS_FREERDP_EX* pEntryPointsEx =
(CHANNEL_ENTRY_POINTS_FREERDP_EX*)pEntryPoints;
if ((pEntryPointsEx->cbSize >= sizeof(CHANNEL_ENTRY_POINTS_FREERDP_EX)) &&
(pEntryPointsEx->MagicNumber == FREERDP_CHANNEL_MAGIC_NUMBER))
@@ -2476,7 +2473,7 @@ FREERDP_ENTRY_POINT(BOOL VCAPITYPE VirtualChannelEntryEx(PCHANNEL_ENTRY_POINTS p
CopyMemory(&(rdpdr->channelEntryPoints), pEntryPoints, sizeof(CHANNEL_ENTRY_POINTS_FREERDP_EX));
rdpdr->InitHandle = pInitHandle;
rc = rdpdr->channelEntryPoints.pVirtualChannelInitEx(
const UINT rc = rdpdr->channelEntryPoints.pVirtualChannelInitEx(
rdpdr, &rdpdr->context, pInitHandle, &rdpdr->channelDef, 1, VIRTUAL_CHANNEL_VERSION_WIN2000,
rdpdr_virtual_channel_init_event_ex);

View File

@@ -1567,8 +1567,8 @@ fail:
return NULL;
}
/* rdpsnd is always built-in */
FREERDP_ENTRY_POINT(BOOL VCAPITYPE rdpsnd_VirtualChannelEntryEx(PCHANNEL_ENTRY_POINTS pEntryPoints,
PVOID pInitHandle))
FREERDP_ENTRY_POINT(BOOL VCAPITYPE rdpsnd_VirtualChannelEntryEx(
PCHANNEL_ENTRY_POINTS_EX pEntryPoints, PVOID pInitHandle))
{
UINT rc = 0;
rdpsndPlugin* rdpsnd = NULL;

View File

@@ -987,7 +987,7 @@ static VOID VCAPITYPE remdesk_virtual_channel_init_event_ex(LPVOID lpUserParam,
/* remdesk is always built-in */
#define VirtualChannelEntryEx remdesk_VirtualChannelEntryEx
FREERDP_ENTRY_POINT(BOOL VCAPITYPE VirtualChannelEntryEx(PCHANNEL_ENTRY_POINTS pEntryPoints,
FREERDP_ENTRY_POINT(BOOL VCAPITYPE VirtualChannelEntryEx(PCHANNEL_ENTRY_POINTS_EX pEntryPoints,
PVOID pInitHandle))
{
UINT rc = 0;

View File

@@ -1385,8 +1385,6 @@ static BOOL freerdp_channels_is_loaded_ex(rdpChannels* channels, PVIRTUALCHANNEL
int freerdp_channels_client_load(rdpChannels* channels, WINPR_ATTR_UNUSED rdpSettings* settings,
PVIRTUALCHANNELENTRY entry, void* data)
{
int status = 0;
CHANNEL_ENTRY_POINTS_FREERDP EntryPoints = { 0 };
CHANNEL_CLIENT_DATA* pChannelClientData = NULL;
WINPR_ASSERT(channels);
@@ -1409,19 +1407,29 @@ int freerdp_channels_client_load(rdpChannels* channels, WINPR_ATTR_UNUSED rdpSet
pChannelClientData = &channels->clientDataList[channels->clientDataCount];
pChannelClientData->entry = entry;
EntryPoints.cbSize = sizeof(EntryPoints);
EntryPoints.protocolVersion = VIRTUAL_CHANNEL_VERSION_WIN2000;
EntryPoints.pVirtualChannelInit = FreeRDP_VirtualChannelInit;
EntryPoints.pVirtualChannelOpen = FreeRDP_VirtualChannelOpen;
EntryPoints.pVirtualChannelClose = FreeRDP_VirtualChannelClose;
EntryPoints.pVirtualChannelWrite = FreeRDP_VirtualChannelWrite;
EntryPoints.MagicNumber = FREERDP_CHANNEL_MAGIC_NUMBER;
EntryPoints.pExtendedData = data;
EntryPoints.context = channels->instance->context;
CHANNEL_ENTRY_POINTS_FREERDP EntryPoints = { .cbSize = sizeof(EntryPoints),
.protocolVersion = VIRTUAL_CHANNEL_VERSION_WIN2000,
.pVirtualChannelInit = FreeRDP_VirtualChannelInit,
.pVirtualChannelOpen = FreeRDP_VirtualChannelOpen,
.pVirtualChannelClose =
FreeRDP_VirtualChannelClose,
.pVirtualChannelWrite =
FreeRDP_VirtualChannelWrite,
.MagicNumber = FREERDP_CHANNEL_MAGIC_NUMBER,
.pExtendedData = data,
.context = channels->instance->context };
/* enable VirtualChannelInit */
union
{
PCHANNEL_ENTRY_POINTS_FREERDP pfx;
PCHANNEL_ENTRY_POINTS px;
} ptr;
ptr.pfx = &EntryPoints;
channels->can_call_init = TRUE;
EnterCriticalSection(&channels->channelsLock);
status = pChannelClientData->entry((PCHANNEL_ENTRY_POINTS)&EntryPoints);
const BOOL status = pChannelClientData->entry(ptr.px);
LeaveCriticalSection(&channels->channelsLock);
/* disable MyVirtualChannelInit */
channels->can_call_init = FALSE;
@@ -1438,12 +1446,6 @@ int freerdp_channels_client_load(rdpChannels* channels, WINPR_ATTR_UNUSED rdpSet
int freerdp_channels_client_load_ex(rdpChannels* channels, WINPR_ATTR_UNUSED rdpSettings* settings,
PVIRTUALCHANNELENTRYEX entryEx, void* data)
{
int status = 0;
void* pInitHandle = NULL;
CHANNEL_ENTRY_POINTS_FREERDP_EX EntryPointsEx = { 0 };
CHANNEL_INIT_DATA* pChannelInitData = NULL;
CHANNEL_CLIENT_DATA* pChannelClientData = NULL;
WINPR_ASSERT(channels);
WINPR_ASSERT(channels->instance);
WINPR_ASSERT(channels->instance->context);
@@ -1461,24 +1463,37 @@ int freerdp_channels_client_load_ex(rdpChannels* channels, WINPR_ATTR_UNUSED rdp
return 0;
}
pChannelClientData = &channels->clientDataList[channels->clientDataCount];
CHANNEL_CLIENT_DATA* pChannelClientData = &channels->clientDataList[channels->clientDataCount];
pChannelClientData->entryEx = entryEx;
pChannelInitData = &(channels->initDataList[channels->initDataCount++]);
pInitHandle = pChannelInitData;
CHANNEL_INIT_DATA* pChannelInitData = &(channels->initDataList[channels->initDataCount++]);
void* pInitHandle = pChannelInitData;
pChannelInitData->channels = channels;
EntryPointsEx.cbSize = sizeof(EntryPointsEx);
EntryPointsEx.protocolVersion = VIRTUAL_CHANNEL_VERSION_WIN2000;
EntryPointsEx.pVirtualChannelInitEx = FreeRDP_VirtualChannelInitEx;
EntryPointsEx.pVirtualChannelOpenEx = FreeRDP_VirtualChannelOpenEx;
EntryPointsEx.pVirtualChannelCloseEx = FreeRDP_VirtualChannelCloseEx;
EntryPointsEx.pVirtualChannelWriteEx = FreeRDP_VirtualChannelWriteEx;
EntryPointsEx.MagicNumber = FREERDP_CHANNEL_MAGIC_NUMBER;
EntryPointsEx.pExtendedData = data;
EntryPointsEx.context = channels->instance->context;
CHANNEL_ENTRY_POINTS_FREERDP_EX EntryPointsEx = {
.cbSize = sizeof(EntryPointsEx),
.protocolVersion = VIRTUAL_CHANNEL_VERSION_WIN2000,
.pVirtualChannelInitEx = FreeRDP_VirtualChannelInitEx,
.pVirtualChannelOpenEx = FreeRDP_VirtualChannelOpenEx,
.pVirtualChannelCloseEx = FreeRDP_VirtualChannelCloseEx,
.pVirtualChannelWriteEx = FreeRDP_VirtualChannelWriteEx,
.MagicNumber = FREERDP_CHANNEL_MAGIC_NUMBER,
.pExtendedData = data,
.context = channels->instance->context
};
union
{
PCHANNEL_ENTRY_POINTS_FREERDP_EX pfx;
PCHANNEL_ENTRY_POINTS_EX px;
} ptr;
ptr.pfx = &EntryPointsEx;
/* enable VirtualChannelInit */
channels->can_call_init = TRUE;
EnterCriticalSection(&channels->channelsLock);
status = pChannelClientData->entryEx((PCHANNEL_ENTRY_POINTS_EX)&EntryPointsEx, pInitHandle);
const BOOL status = pChannelClientData->entryEx(ptr.px, pInitHandle);
LeaveCriticalSection(&channels->channelsLock);
/* disable MyVirtualChannelInit */
channels->can_call_init = FALSE;

View File

@@ -251,17 +251,9 @@ BOOL NamedPipeRead(PVOID Object, LPVOID lpBuffer, DWORD nNumberOfBytesToRead,
LPDWORD lpNumberOfBytesRead, LPOVERLAPPED lpOverlapped)
{
SSIZE_T io_status = 0;
WINPR_NAMED_PIPE* pipe = NULL;
BOOL status = TRUE;
if (lpOverlapped)
{
WLog_ERR(TAG, "WinPR does not support the lpOverlapped parameter");
SetLastError(ERROR_NOT_SUPPORTED);
return FALSE;
}
pipe = (WINPR_NAMED_PIPE*)Object;
WINPR_NAMED_PIPE* pipe = (WINPR_NAMED_PIPE*)Object;
if (!(pipe->dwFlagsAndAttributes & FILE_FLAG_OVERLAPPED))
{
@@ -301,7 +293,11 @@ BOOL NamedPipeRead(PVOID Object, LPVOID lpBuffer, DWORD nNumberOfBytesToRead,
{
/* Overlapped I/O */
if (!lpOverlapped)
{
WLog_ERR(TAG, "%s requires lpOverlapped != NULL as FILE_FLAG_OVERLAPPED is set");
SetLastError(ERROR_NOT_SUPPORTED);
return FALSE;
}
if (pipe->clientfd == -1)
return FALSE;