From 7485c01a8caf5a6ac5955f4d8496c8ced12bb66d Mon Sep 17 00:00:00 2001 From: Armin Novak Date: Tue, 3 Mar 2026 16:58:32 +0100 Subject: [PATCH 1/6] [freerdp,API] fix broken deprecation declarations --- include/freerdp/freerdp.h | 21 ++++++++++----------- include/freerdp/settings.h | 9 ++++----- 2 files changed, 14 insertions(+), 16 deletions(-) diff --git a/include/freerdp/freerdp.h b/include/freerdp/freerdp.h index 26336f7cd..d1b23cf22 100644 --- a/include/freerdp/freerdp.h +++ b/include/freerdp/freerdp.h @@ -220,11 +220,10 @@ extern "C" * a certificate only for this session, 0 otherwise. */ #if defined(WITH_FREERDP_DEPRECATED) - typedef WINPR_DEPRECATED_VAR( - "Use pVerifyCertificateEx", - DWORD (*pVerifyCertificate)(freerdp* instance, const char* common_name, const char* subject, - const char* issuer, const char* fingerprint, - BOOL host_mismatch)); + WINPR_DEPRECATED_VAR("Use pVerifyCertificateEx", + typedef DWORD (*pVerifyCertificate)( + freerdp* instance, const char* common_name, const char* subject, + const char* issuer, const char* fingerprint, BOOL host_mismatch)); #endif /** @brief Callback used if user interaction is required to accept @@ -262,12 +261,12 @@ extern "C" * a certificate only for this session, 0 otherwise. */ #if defined(WITH_FREERDP_DEPRECATED) - typedef WINPR_DEPRECATED_VAR( - "Use pVerifyChangedCertificateEx", - DWORD (*pVerifyChangedCertificate)(freerdp* instance, const char* common_name, - const char* subject, const char* issuer, - const char* new_fingerprint, const char* old_subject, - const char* old_issuer, const char* old_fingerprint)); + WINPR_DEPRECATED_VAR("Use pVerifyChangedCertificateEx", + typedef DWORD (*pVerifyChangedCertificate)( + freerdp* instance, const char* common_name, const char* subject, + const char* issuer, const char* new_fingerprint, + const char* old_subject, const char* old_issuer, + const char* old_fingerprint)); #endif /** @brief Callback used if user interaction is required to accept diff --git a/include/freerdp/settings.h b/include/freerdp/settings.h index 2e593617c..6d8b6f483 100644 --- a/include/freerdp/settings.h +++ b/include/freerdp/settings.h @@ -239,9 +239,8 @@ extern "C" FREERDP_API ADDIN_ARGV* freerdp_static_channel_collection_find(rdpSettings* settings, const char* name); #if defined(WITH_FREERDP_DEPRECATED) - WINPR_DEPRECATED( - WINPR_ATTR_NODISCARD FREERDP_API ADDIN_ARGV* WINPR_ATTR_MALLOC(freerdp_addin_argv_free, 1) - WINPR_ATTR_NODISCARD freerdp_static_channel_clone(ADDIN_ARGV* channel)); + WINPR_DEPRECATED(WINPR_ATTR_MALLOC(freerdp_addin_argv_free, 1) + FREERDP_API ADDIN_ARGV* freerdp_static_channel_clone(ADDIN_ARGV* channel)); #endif FREERDP_API void freerdp_static_channel_collection_free(rdpSettings* settings); @@ -259,8 +258,8 @@ extern "C" #if defined(WITH_FREERDP_DEPRECATED) WINPR_DEPRECATED( - WINPR_ATTR_NODISCARD FREERDP_API ADDIN_ARGV* WINPR_ATTR_MALLOC(freerdp_addin_argv_free, 1) - WINPR_ATTR_NODISCARD freerdp_dynamic_channel_clone(ADDIN_ARGV* channel)); + WINPR_ATTR_MALLOC(freerdp_addin_argv_free, 1) + FREERDP_API ADDIN_ARGV* freerdp_dynamic_channel_clone(ADDIN_ARGV* channel)); #endif FREERDP_API void freerdp_dynamic_channel_collection_free(rdpSettings* settings); From 45494b02a3a874dc84337e5731f1917c59b5ed66 Mon Sep 17 00:00:00 2001 From: Armin Novak Date: Tue, 3 Mar 2026 16:44:36 +0100 Subject: [PATCH 2/6] [core,server] FreeRDP_WTSVirtualChannelRead checks Properly check MessageQueue_Peek return and propagate failure. --- libfreerdp/core/server.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/libfreerdp/core/server.c b/libfreerdp/core/server.c index d66f5baa2..8b4152046 100644 --- a/libfreerdp/core/server.c +++ b/libfreerdp/core/server.c @@ -1656,8 +1656,10 @@ BOOL WINAPI FreeRDP_WTSVirtualChannelRead(HANDLE hChannelHandle, WINPR_ATTR_UNUS if (messageCtx->offset >= messageCtx->length) { - (void)MessageQueue_Peek(channel->queue, &message, TRUE); + const int rc = MessageQueue_Peek(channel->queue, &message, TRUE); peer_channel_queue_free_message(&message); + if (rc < 0) + return FALSE; } return TRUE; From 1a8e72074eb28caa95524481ef6d78f856281d12 Mon Sep 17 00:00:00 2001 From: Armin Novak Date: Tue, 3 Mar 2026 17:00:59 +0100 Subject: [PATCH 3/6] [winpr,return] improve return value checks propagate error conditions up the call chain --- .../libwinpr/utils/collections/MessageQueue.c | 8 ++++++-- winpr/libwinpr/utils/collections/Queue.c | 5 ++++- winpr/libwinpr/utils/wlog/UdpAppender.c | 20 +++++++++++-------- 3 files changed, 22 insertions(+), 11 deletions(-) diff --git a/winpr/libwinpr/utils/collections/MessageQueue.c b/winpr/libwinpr/utils/collections/MessageQueue.c index 299fa1f49..37ecec0f5 100644 --- a/winpr/libwinpr/utils/collections/MessageQueue.c +++ b/winpr/libwinpr/utils/collections/MessageQueue.c @@ -263,7 +263,10 @@ int MessageQueue_Peek(wMessageQueue* queue, wMessage* message, BOOL remove) queue->size--; if (queue->size < 1) - (void)ResetEvent(queue->event); + { + if (ResetEvent(queue->event)) + status = -1; + } } } @@ -346,7 +349,8 @@ int MessageQueue_Clear(wMessageQueue* queue) queue->head = (queue->head + 1) % queue->capacity; queue->size--; } - (void)ResetEvent(queue->event); + if (!ResetEvent(queue->event)) + status = -1; queue->closed = FALSE; LeaveCriticalSection(&queue->lock); diff --git a/winpr/libwinpr/utils/collections/Queue.c b/winpr/libwinpr/utils/collections/Queue.c index a0d7f503e..83f504db7 100644 --- a/winpr/libwinpr/utils/collections/Queue.c +++ b/winpr/libwinpr/utils/collections/Queue.c @@ -278,7 +278,10 @@ BOOL Queue_Enqueue(wQueue* queue, const void* obj) queue->size++; if (signalSet) - (void)SetEvent(queue->event); + { + if (!SetEvent(queue->event)) + goto out; + } } out: diff --git a/winpr/libwinpr/utils/wlog/UdpAppender.c b/winpr/libwinpr/utils/wlog/UdpAppender.c index 50a3928c0..f5357f8a4 100644 --- a/winpr/libwinpr/utils/wlog/UdpAppender.c +++ b/winpr/libwinpr/utils/wlog/UdpAppender.c @@ -95,14 +95,18 @@ static BOOL WLog_UdpAppender_WriteMessage(wLog* log, wLogAppender* appender, char prefix[WLOG_MAX_PREFIX_SIZE] = WINPR_C_ARRAY_INIT; WLog_Layout_GetMessagePrefix(log, appender->Layout, cmessage, prefix, sizeof(prefix)); - (void)_sendto(udpAppender->sock, prefix, (int)strnlen(prefix, ARRAYSIZE(prefix)), 0, - &udpAppender->targetAddr, udpAppender->targetAddrLen); - (void)_sendto(udpAppender->sock, cmessage->TextString, - (int)strnlen(cmessage->TextString, INT_MAX), 0, &udpAppender->targetAddr, - udpAppender->targetAddrLen); - (void)_sendto(udpAppender->sock, "\n", 1, 0, &udpAppender->targetAddr, - udpAppender->targetAddrLen); - return TRUE; + BOOL res = TRUE; + if (_sendto(udpAppender->sock, prefix, (int)strnlen(prefix, ARRAYSIZE(prefix)), 0, + &udpAppender->targetAddr, udpAppender->targetAddrLen) < 0) + res = FALSE; + if (_sendto(udpAppender->sock, cmessage->TextString, + (int)strnlen(cmessage->TextString, INT_MAX), 0, &udpAppender->targetAddr, + udpAppender->targetAddrLen) < 0) + res = FALSE; + if (_sendto(udpAppender->sock, "\n", 1, 0, &udpAppender->targetAddr, + udpAppender->targetAddrLen) < 0) + res = FALSE; + return res; } static BOOL WLog_UdpAppender_WriteDataMessage(wLog* log, wLogAppender* appender, From 0d998960947c7e8b512e7bc238f4b03ef6197aee Mon Sep 17 00:00:00 2001 From: Armin Novak Date: Tue, 3 Mar 2026 17:01:46 +0100 Subject: [PATCH 4/6] [core,return] improve return value checks propagate error conditions back the call chain --- libfreerdp/common/assistance.c | 28 ++++++++++++---------------- libfreerdp/core/multitransport.c | 3 ++- libfreerdp/core/smartcardlogon.c | 17 +++++++++-------- libfreerdp/core/streamdump.c | 5 ++++- 4 files changed, 27 insertions(+), 26 deletions(-) diff --git a/libfreerdp/common/assistance.c b/libfreerdp/common/assistance.c index 212e8467b..5161411e6 100644 --- a/libfreerdp/common/assistance.c +++ b/libfreerdp/common/assistance.c @@ -1225,9 +1225,8 @@ int freerdp_assistance_parse_file_buffer(rdpAssistanceFile* file, const char* cb int freerdp_assistance_parse_file(rdpAssistanceFile* file, const char* name, const char* password) { - int status = 0; + int status = -1; BYTE* buffer = nullptr; - FILE* fp = nullptr; size_t readSize = 0; union { @@ -1238,7 +1237,7 @@ int freerdp_assistance_parse_file(rdpAssistanceFile* file, const char* name, con if (!update_name(file, name)) return -1; - fp = winpr_fopen(name, "r"); + FILE* fp = winpr_fopen(name, "r"); if (!fp) { @@ -1246,24 +1245,22 @@ int freerdp_assistance_parse_file(rdpAssistanceFile* file, const char* name, con return -1; } - (void)_fseeki64(fp, 0, SEEK_END); + if (_fseeki64(fp, 0, SEEK_END) < 0) + goto fail; fileSize.i64 = _ftelli64(fp); - (void)_fseeki64(fp, 0, SEEK_SET); + if (_fseeki64(fp, 0, SEEK_SET) < 0) + goto fail; if (fileSize.i64 < 1) { WLog_ERR(TAG, "Failed to read ASSISTANCE file %s ", name); - (void)fclose(fp); - return -1; + goto fail; } buffer = (BYTE*)malloc(fileSize.s + 2); if (!buffer) - { - (void)fclose(fp); - return -1; - } + goto fail; readSize = fread(buffer, fileSize.s, 1, fp); @@ -1273,19 +1270,18 @@ int freerdp_assistance_parse_file(rdpAssistanceFile* file, const char* name, con readSize = fileSize.s; } - (void)fclose(fp); - if (readSize < 1) { WLog_ERR(TAG, "Failed to read ASSISTANCE file %s ", name); - free(buffer); - buffer = nullptr; - return -1; + goto fail; } buffer[fileSize.s] = '\0'; buffer[fileSize.s + 1] = '\0'; status = freerdp_assistance_parse_file_buffer(file, (char*)buffer, fileSize.s, password); + +fail: + (void)fclose(fp); free(buffer); return status; } diff --git a/libfreerdp/core/multitransport.c b/libfreerdp/core/multitransport.c index df12ea45d..f4fbfea25 100644 --- a/libfreerdp/core/multitransport.c +++ b/libfreerdp/core/multitransport.c @@ -85,7 +85,8 @@ state_run_t multitransport_recv_request(rdpMultitransport* multi, wStream* s) WLog_WARN(TAG, "reserved is %" PRIu16 " instead of 0, skipping %" PRIuz "bytes of unknown data", reserved, Stream_GetRemainingLength(s)); - (void)Stream_SafeSeek(s, Stream_GetRemainingLength(s)); + if (!Stream_SafeSeek(s, Stream_GetRemainingLength(s))) + return STATE_RUN_FAILED; } WINPR_ASSERT(multi->MtRequest); diff --git a/libfreerdp/core/smartcardlogon.c b/libfreerdp/core/smartcardlogon.c index 468bb32ee..23ee66c0e 100644 --- a/libfreerdp/core/smartcardlogon.c +++ b/libfreerdp/core/smartcardlogon.c @@ -58,15 +58,16 @@ static void delete_file(char* path) int rs = _fseeki64(fp, 0, SEEK_END); if (rs == 0) size = _ftelli64(fp); - (void)_fseeki64(fp, 0, SEEK_SET); - - for (INT64 x = 0; x < size; x += sizeof(buffer)) + if (_fseeki64(fp, 0, SEEK_SET) == 0) { - const size_t dnmemb = (size_t)(size - x); - const size_t nmemb = MIN(sizeof(buffer), dnmemb); - const size_t count = fwrite(buffer, nmemb, 1, fp); - if (count != 1) - break; + for (INT64 x = 0; x < size; x += sizeof(buffer)) + { + const size_t dnmemb = (size_t)(size - x); + const size_t nmemb = MIN(sizeof(buffer), dnmemb); + const size_t count = fwrite(buffer, nmemb, 1, fp); + if (count != 1) + break; + } } (void)fclose(fp); diff --git a/libfreerdp/core/streamdump.c b/libfreerdp/core/streamdump.c index 01829c69e..1b2176cf2 100644 --- a/libfreerdp/core/streamdump.c +++ b/libfreerdp/core/streamdump.c @@ -79,7 +79,10 @@ static return FALSE; if (pOffset) - (void)_fseeki64(fp, WINPR_ASSERTING_INT_CAST(int64_t, *pOffset), SEEK_SET); + { + if (_fseeki64(fp, WINPR_ASSERTING_INT_CAST(int64_t, *pOffset), SEEK_SET) < 0) + goto fail; + } r = fread(&ts, 1, sizeof(ts), fp); if (r != sizeof(ts)) From 782c3d3069f680737196c2cd483065b3dac0475e Mon Sep 17 00:00:00 2001 From: Armin Novak Date: Tue, 3 Mar 2026 17:02:23 +0100 Subject: [PATCH 5/6] [client,common] check _fseeki64 return propagate error conditions back the call chain --- client/common/file.c | 22 ++++++++++------------ 1 file changed, 10 insertions(+), 12 deletions(-) diff --git a/client/common/file.c b/client/common/file.c index 3a4e6910f..ee269f7cd 100644 --- a/client/common/file.c +++ b/client/common/file.c @@ -1021,24 +1021,22 @@ BOOL freerdp_client_parse_rdp_file_ex(rdpFile* file, const char* name, rdp_file_ return FALSE; } - (void)_fseeki64(fp, 0, SEEK_END); + if (_fseeki64(fp, 0, SEEK_END) < 0) + goto fail; file_size = _ftelli64(fp); - (void)_fseeki64(fp, 0, SEEK_SET); + if (_fseeki64(fp, 0, SEEK_SET) < 0) + goto fail; if (file_size < 1) { WLog_ERR(TAG, "RDP file %s is empty", name); - (void)fclose(fp); - return FALSE; + goto fail; } buffer = (BYTE*)malloc((size_t)file_size + 2); if (!buffer) - { - (void)fclose(fp); - return FALSE; - } + goto fail; read_size = fread(buffer, (size_t)file_size, 1, fp); @@ -1048,18 +1046,18 @@ BOOL freerdp_client_parse_rdp_file_ex(rdpFile* file, const char* name, rdp_file_ read_size = (size_t)file_size; } - (void)fclose(fp); - if (read_size < 1) { WLog_ERR(TAG, "Could not read from RDP file %s", name); - free(buffer); - return FALSE; + goto fail; } buffer[file_size] = '\0'; buffer[file_size + 1] = '\0'; status = freerdp_client_parse_rdp_file_buffer_ex(file, buffer, (size_t)file_size, parse); + +fail: + (void)fclose(fp); free(buffer); return status; } From 4b4368fc197ee3217c77cda8090f030ca8d5b0d1 Mon Sep 17 00:00:00 2001 From: Armin Novak Date: Tue, 3 Mar 2026 17:23:32 +0100 Subject: [PATCH 6/6] [compiler,gcc] fix function pointer casts use dedicated macro WINPR_FUNC_PTR_CAST to cast function pointers without warnings. --- channels/drdynvc/client/drdynvc_main.c | 6 +-- libfreerdp/core/client.c | 4 +- winpr/libwinpr/smartcard/smartcard.c | 63 ++++++++++++-------------- 3 files changed, 35 insertions(+), 38 deletions(-) diff --git a/channels/drdynvc/client/drdynvc_main.c b/channels/drdynvc/client/drdynvc_main.c index c0053c569..5b37d039a 100644 --- a/channels/drdynvc/client/drdynvc_main.c +++ b/channels/drdynvc/client/drdynvc_main.c @@ -456,9 +456,9 @@ static void check_open_close_receive(DVCMAN_CHANNEL* channel) WINPR_ASSERT(cb); if (!cb->OnOpen || !cb->OnClose || !cb->OnDataReceived) WLog_VRB(TAG, "{%s:%" PRIu32 "} OnOpen=%p, OnClose=%p, OnDataReceived=%p", name, id, - WINPR_CXX_COMPAT_CAST(const void*, cb->OnOpen), - WINPR_CXX_COMPAT_CAST(const void*, cb->OnClose), - WINPR_CXX_COMPAT_CAST(const void*, cb->OnDataReceived)); + WINPR_FUNC_PTR_CAST(cb->OnOpen, const void*), + WINPR_FUNC_PTR_CAST(cb->OnClose, const void*), + WINPR_FUNC_PTR_CAST(cb->OnDataReceived, const void*)); } static UINT dvcman_call_on_receive(DVCMAN_CHANNEL* channel, wStream* data) diff --git a/libfreerdp/core/client.c b/libfreerdp/core/client.c index 0e695f5fe..c52abe056 100644 --- a/libfreerdp/core/client.c +++ b/libfreerdp/core/client.c @@ -851,8 +851,8 @@ BOOL freerdp_client_channel_register(rdpChannels* channels, HANDLE handle, if (!channels || (handle == INVALID_HANDLE_VALUE) || !fkt) { WLog_ERR(TAG, "Invalid function arguments (channels=%p, handle=%p, fkt=%p, userdata=%p", - WINPR_CXX_COMPAT_CAST(const void*, channels), handle, - WINPR_CXX_COMPAT_CAST(const void*, fkt), userdata); + WINPR_FUNC_PTR_CAST(channels, const void*), handle, + WINPR_FUNC_PTR_CAST(fkt, const void*), userdata); return FALSE; } diff --git a/winpr/libwinpr/smartcard/smartcard.c b/winpr/libwinpr/smartcard/smartcard.c index 004a1a96f..2fbd949f9 100644 --- a/winpr/libwinpr/smartcard/smartcard.c +++ b/winpr/libwinpr/smartcard/smartcard.c @@ -44,43 +44,40 @@ static const SCardApiFunctionTable* g_SCardApi = nullptr; #define xstr(s) str(s) #define str(s) #s -#define SCARDAPI_STUB_CALL_LONG(_name, ...) \ - if (!InitOnceExecuteOnce(&g_Initialized, InitializeSCardApiStubs, nullptr, nullptr)) \ - return SCARD_E_NO_SERVICE; \ - if (!g_SCardApi || !g_SCardApi->pfn##_name) \ - { \ - WLog_DBG( \ - TAG, "Missing function pointer g_SCardApi=%p->" xstr(pfn##_name) "=%p", \ - WINPR_CXX_COMPAT_CAST(const void*, g_SCardApi), \ - WINPR_CXX_COMPAT_CAST(const void*, g_SCardApi ? g_SCardApi->pfn##_name : nullptr)); \ - return SCARD_E_NO_SERVICE; \ - } \ +#define SCARDAPI_STUB_CALL_LONG(_name, ...) \ + if (!InitOnceExecuteOnce(&g_Initialized, InitializeSCardApiStubs, nullptr, nullptr)) \ + return SCARD_E_NO_SERVICE; \ + if (!g_SCardApi || !g_SCardApi->pfn##_name) \ + { \ + WLog_DBG(TAG, "Missing function pointer g_SCardApi=%p->" xstr(pfn##_name) "=%p", \ + WINPR_FUNC_PTR_CAST(g_SCardApi, const void*), \ + WINPR_FUNC_PTR_CAST(g_SCardApi ? g_SCardApi->pfn##_name : nullptr, const void*)); \ + return SCARD_E_NO_SERVICE; \ + } \ return g_SCardApi->pfn##_name(__VA_ARGS__) -#define SCARDAPI_STUB_CALL_HANDLE(_name) \ - if (!InitOnceExecuteOnce(&g_Initialized, InitializeSCardApiStubs, nullptr, nullptr)) \ - return nullptr; \ - if (!g_SCardApi || !g_SCardApi->pfn##_name) \ - { \ - WLog_DBG( \ - TAG, "Missing function pointer g_SCardApi=%p->" xstr(pfn##_name) "=%p", \ - WINPR_CXX_COMPAT_CAST(const void*, g_SCardApi), \ - WINPR_CXX_COMPAT_CAST(const void*, g_SCardApi ? g_SCardApi->pfn##_name : nullptr)); \ - return nullptr; \ - } \ +#define SCARDAPI_STUB_CALL_HANDLE(_name) \ + if (!InitOnceExecuteOnce(&g_Initialized, InitializeSCardApiStubs, nullptr, nullptr)) \ + return nullptr; \ + if (!g_SCardApi || !g_SCardApi->pfn##_name) \ + { \ + WLog_DBG(TAG, "Missing function pointer g_SCardApi=%p->" xstr(pfn##_name) "=%p", \ + WINPR_FUNC_PTR_CAST(g_SCardApi, const void*), \ + WINPR_FUNC_PTR_CAST(g_SCardApi ? g_SCardApi->pfn##_name : nullptr, const void*)); \ + return nullptr; \ + } \ return g_SCardApi->pfn##_name() -#define SCARDAPI_STUB_CALL_VOID(_name) \ - if (!InitOnceExecuteOnce(&g_Initialized, InitializeSCardApiStubs, nullptr, nullptr)) \ - return; \ - if (!g_SCardApi || !g_SCardApi->pfn##_name) \ - { \ - WLog_DBG( \ - TAG, "Missing function pointer g_SCardApi=%p->" xstr(pfn##_name) "=%p", \ - WINPR_CXX_COMPAT_CAST(const void*, g_SCardApi), \ - WINPR_CXX_COMPAT_CAST(const void*, g_SCardApi ? g_SCardApi->pfn##_name : nullptr)); \ - return; \ - } \ +#define SCARDAPI_STUB_CALL_VOID(_name) \ + if (!InitOnceExecuteOnce(&g_Initialized, InitializeSCardApiStubs, nullptr, nullptr)) \ + return; \ + if (!g_SCardApi || !g_SCardApi->pfn##_name) \ + { \ + WLog_DBG(TAG, "Missing function pointer g_SCardApi=%p->" xstr(pfn##_name) "=%p", \ + WINPR_FUNC_PTR_CAST(g_SCardApi, const void*), \ + WINPR_FUNC_PTR_CAST(g_SCardApi ? g_SCardApi->pfn##_name : nullptr, const void*)); \ + return; \ + } \ g_SCardApi->pfn##_name() /**