From 8cd987dacd67e163b795300e42e4d675ae970827 Mon Sep 17 00:00:00 2001 From: Armin Novak Date: Wed, 14 Jan 2026 10:13:26 +0100 Subject: [PATCH 01/17] [channels,serial] fix unintialized variable on jump --- channels/serial/client/serial_main.c | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/channels/serial/client/serial_main.c b/channels/serial/client/serial_main.c index 59ef0cb9b..cef571464 100644 --- a/channels/serial/client/serial_main.c +++ b/channels/serial/client/serial_main.c @@ -690,13 +690,16 @@ static void create_irp_thread(SERIAL_DEVICE* serial, IRP* irp) * for threads. */ } - const BOOL added = ListDictionary_Add(serial->IrpThreads, (void*)key, irpThread); - ListDictionary_Unlock(serial->IrpThreads); - if (!added) { - WLog_Print(serial->log, WLOG_ERROR, "ListDictionary_Add failed!"); - goto error_handle; + const BOOL added = ListDictionary_Add(serial->IrpThreads, (void*)key, irpThread); + ListDictionary_Unlock(serial->IrpThreads); + + if (!added) + { + WLog_Print(serial->log, WLOG_ERROR, "ListDictionary_Add failed!"); + goto error_handle; + } } ResumeThread(irpThread); From a30cbe2a94deea4ec25304c1375acc415b732ea1 Mon Sep 17 00:00:00 2001 From: Armin Novak Date: Wed, 14 Jan 2026 10:13:17 +0100 Subject: [PATCH 02/17] [channels,location] fix Wimplicit-int-enum-cast warnings --- channels/location/client/location_main.c | 29 +++++++++------- channels/location/server/location_main.c | 42 +++++++++++++++--------- 2 files changed, 44 insertions(+), 27 deletions(-) diff --git a/channels/location/client/location_main.c b/channels/location/client/location_main.c index d6c96de14..37bddf8cb 100644 --- a/channels/location/client/location_main.c +++ b/channels/location/client/location_main.c @@ -358,14 +358,18 @@ static UINT location_send(LocationClientContext* context, LOCATION_PDUTYPE type, res = ERROR_INVALID_PARAMETER; else { - RDPLOCATION_BASE_LOCATION3D_PDU pdu = { 0 }; LOCATIONSOURCE source = LOCATIONSOURCE_IP; double speed = FP_NAN; double heading = FP_NAN; double horizontalAccuracy = FP_NAN; - pdu.latitude = va_arg(ap, double); - pdu.longitude = va_arg(ap, double); - pdu.altitude = va_arg(ap, INT32); + RDPLOCATION_BASE_LOCATION3D_PDU pdu = { .latitude = va_arg(ap, double), + .longitude = va_arg(ap, double), + .altitude = va_arg(ap, INT32), + .speed = NULL, + .heading = NULL, + .horizontalAccuracy = NULL, + .source = NULL }; + if ((count > 3) && (callback->clientVersion >= RDPLOCATION_PROTOCOL_VERSION_200)) { speed = va_arg(ap, double); @@ -385,10 +389,10 @@ static UINT location_send(LocationClientContext* context, LOCATION_PDUTYPE type, res = ERROR_INVALID_PARAMETER; else { - RDPLOCATION_LOCATION2D_DELTA_PDU pdu = { 0 }; - - pdu.latitudeDelta = va_arg(ap, double); - pdu.longitudeDelta = va_arg(ap, double); + RDPLOCATION_LOCATION2D_DELTA_PDU pdu = { .latitudeDelta = va_arg(ap, double), + .longitudeDelta = va_arg(ap, double), + .speedDelta = NULL, + .headingDelta = NULL }; double speedDelta = FP_NAN; double headingDelta = FP_NAN; @@ -407,13 +411,14 @@ static UINT location_send(LocationClientContext* context, LOCATION_PDUTYPE type, res = ERROR_INVALID_PARAMETER; else { - RDPLOCATION_LOCATION3D_DELTA_PDU pdu = { 0 }; double speedDelta = FP_NAN; double headingDelta = FP_NAN; - pdu.latitudeDelta = va_arg(ap, double); - pdu.longitudeDelta = va_arg(ap, double); - pdu.altitudeDelta = va_arg(ap, INT32); + RDPLOCATION_LOCATION3D_DELTA_PDU pdu = { .latitudeDelta = va_arg(ap, double), + .longitudeDelta = va_arg(ap, double), + .altitudeDelta = va_arg(ap, INT32), + pdu.speedDelta = NULL, + .headingDelta = NULL }; if ((count > 3) && (callback->clientVersion >= RDPLOCATION_PROTOCOL_VERSION_200)) { speedDelta = va_arg(ap, double); diff --git a/channels/location/server/location_main.c b/channels/location/server/location_main.c index 4c224c568..f7061cbb2 100644 --- a/channels/location/server/location_main.c +++ b/channels/location/server/location_main.c @@ -17,6 +17,8 @@ * limitations under the License. */ +#include + #include #include @@ -125,14 +127,15 @@ static UINT location_server_open_channel(location_server* location) static UINT location_server_recv_client_ready(LocationServerContext* context, wStream* s, const RDPLOCATION_HEADER* header) { - RDPLOCATION_CLIENT_READY_PDU pdu = { 0 }; UINT error = CHANNEL_RC_OK; WINPR_ASSERT(context); WINPR_ASSERT(s); WINPR_ASSERT(header); - pdu.header = *header; + RDPLOCATION_CLIENT_READY_PDU pdu = { .header = *header, + .protocolVersion = RDPLOCATION_PROTOCOL_VERSION_100, + .flags = 0 }; if (!Stream_CheckAndLogRequiredLength(TAG, s, 4)) return ERROR_NO_DATA; @@ -170,7 +173,6 @@ static UINT location_server_recv_client_ready(LocationServerContext* context, wS static UINT location_server_recv_base_location3d(LocationServerContext* context, wStream* s, const RDPLOCATION_HEADER* header) { - RDPLOCATION_BASE_LOCATION3D_PDU pdu = { 0 }; UINT error = CHANNEL_RC_OK; double speed = 0.0; double heading = 0.0; @@ -181,7 +183,14 @@ static UINT location_server_recv_base_location3d(LocationServerContext* context, WINPR_ASSERT(s); WINPR_ASSERT(header); - pdu.header = *header; + RDPLOCATION_BASE_LOCATION3D_PDU pdu = { .header = *header, + .latitude = FP_NAN, + .longitude = FP_NAN, + .altitude = 0, + .speed = NULL, + .heading = NULL, + .horizontalAccuracy = NULL, + .source = NULL }; if (!freerdp_read_four_byte_float(s, &pdu.latitude) || !freerdp_read_four_byte_float(s, &pdu.longitude) || @@ -228,7 +237,6 @@ static UINT location_server_recv_base_location3d(LocationServerContext* context, static UINT location_server_recv_location2d_delta(LocationServerContext* context, wStream* s, const RDPLOCATION_HEADER* header) { - RDPLOCATION_LOCATION2D_DELTA_PDU pdu = { 0 }; UINT error = CHANNEL_RC_OK; double speedDelta = 0.0; double headingDelta = 0.0; @@ -237,7 +245,11 @@ static UINT location_server_recv_location2d_delta(LocationServerContext* context WINPR_ASSERT(s); WINPR_ASSERT(header); - pdu.header = *header; + RDPLOCATION_LOCATION2D_DELTA_PDU pdu = { .header = *header, + .latitudeDelta = FP_NAN, + .longitudeDelta = FP_NAN, + .speedDelta = NULL, + .headingDelta = NULL }; if (!freerdp_read_four_byte_float(s, &pdu.latitudeDelta) || !freerdp_read_four_byte_float(s, &pdu.longitudeDelta)) @@ -263,7 +275,6 @@ static UINT location_server_recv_location2d_delta(LocationServerContext* context static UINT location_server_recv_location3d_delta(LocationServerContext* context, wStream* s, const RDPLOCATION_HEADER* header) { - RDPLOCATION_LOCATION3D_DELTA_PDU pdu = { 0 }; UINT error = CHANNEL_RC_OK; double speedDelta = 0.0; double headingDelta = 0.0; @@ -272,7 +283,11 @@ static UINT location_server_recv_location3d_delta(LocationServerContext* context WINPR_ASSERT(s); WINPR_ASSERT(header); - pdu.header = *header; + RDPLOCATION_LOCATION3D_DELTA_PDU pdu = { .header = *header, + .latitudeDelta = FP_NAN, + .longitudeDelta = FP_NAN, + .speedDelta = NULL, + .headingDelta = NULL }; if (!freerdp_read_four_byte_float(s, &pdu.latitudeDelta) || !freerdp_read_four_byte_float(s, &pdu.longitudeDelta) || @@ -298,20 +313,17 @@ static UINT location_server_recv_location3d_delta(LocationServerContext* context static UINT location_process_message(location_server* location) { - BOOL rc = 0; UINT error = ERROR_INTERNAL_ERROR; ULONG BytesReturned = 0; - RDPLOCATION_HEADER header = { 0 }; - wStream* s = NULL; WINPR_ASSERT(location); WINPR_ASSERT(location->location_channel); - s = location->buffer; + wStream* s = location->buffer; WINPR_ASSERT(s); Stream_SetPosition(s, 0); - rc = WTSVirtualChannelRead(location->location_channel, 0, NULL, 0, &BytesReturned); + const BOOL rc = WTSVirtualChannelRead(location->location_channel, 0, NULL, 0, &BytesReturned); if (!rc) goto out; @@ -341,8 +353,8 @@ static UINT location_process_message(location_server* location) { const UINT16 pduType = Stream_Get_UINT16(s); - header.pduType = (LOCATION_PDUTYPE)pduType; - header.pduLength = Stream_Get_UINT32(s); + const RDPLOCATION_HEADER header = { .pduType = (LOCATION_PDUTYPE)pduType, + .pduLength = Stream_Get_UINT32(s) }; switch (pduType) { From ccf2311694ae1118a258e8eaedfacd95d3a3c3ae Mon Sep 17 00:00:00 2001 From: Armin Novak Date: Wed, 14 Jan 2026 10:13:37 +0100 Subject: [PATCH 03/17] [channels,rdpemsc] fix Wimplicit-int-enum-cast warnings --- channels/rdpemsc/server/mouse_cursor_main.c | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/channels/rdpemsc/server/mouse_cursor_main.c b/channels/rdpemsc/server/mouse_cursor_main.c index 4acf94374..451ff2f07 100644 --- a/channels/rdpemsc/server/mouse_cursor_main.c +++ b/channels/rdpemsc/server/mouse_cursor_main.c @@ -190,20 +190,21 @@ static UINT mouse_cursor_server_recv_cs_caps_advertise(MouseCursorServerContext* wStream* s, const RDP_MOUSE_CURSOR_HEADER* header) { - RDP_MOUSE_CURSOR_CAPS_ADVERTISE_PDU pdu = { 0 }; UINT error = CHANNEL_RC_OK; WINPR_ASSERT(context); WINPR_ASSERT(s); WINPR_ASSERT(header); - pdu.header = *header; - /* There must be at least one capability set present */ if (!Stream_CheckAndLogRequiredLength(TAG, s, 12)) return ERROR_NO_DATA; - pdu.capsSets = ArrayList_New(FALSE); + RDP_MOUSE_CURSOR_CAPS_ADVERTISE_PDU pdu = { + .header = *header, + .capsSets = ArrayList_New(FALSE), + }; + if (!pdu.capsSets) { WLog_ERR(TAG, "Failed to allocate arraylist"); @@ -237,7 +238,6 @@ static UINT mouse_cursor_process_message(mouse_cursor_server* mouse_cursor) BOOL rc = 0; UINT error = ERROR_INTERNAL_ERROR; ULONG BytesReturned = 0; - RDP_MOUSE_CURSOR_HEADER header = { 0 }; wStream* s = NULL; WINPR_ASSERT(mouse_cursor); @@ -293,9 +293,10 @@ static UINT mouse_cursor_process_message(mouse_cursor_server* mouse_cursor) updateType); return ERROR_INVALID_DATA; } - header.updateType = (TS_UPDATETYPE_MOUSEPTR)updateType; - Stream_Read_UINT16(s, header.reserved); + RDP_MOUSE_CURSOR_HEADER header = { .updateType = (TS_UPDATETYPE_MOUSEPTR)updateType, + .reserved = Stream_Get_UINT16(s), + .pduType = PDUTYPE_EMSC_RESERVED }; switch (pduType) { From b1cbaaa9fb4cd1a3e1f2d92728a0b0d9708e6eda Mon Sep 17 00:00:00 2001 From: Armin Novak Date: Wed, 14 Jan 2026 10:30:15 +0100 Subject: [PATCH 04/17] [codec,dsp] fix Wimplicit-int-enum-cast warnings --- libfreerdp/codec/dsp_ffmpeg.c | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/libfreerdp/codec/dsp_ffmpeg.c b/libfreerdp/codec/dsp_ffmpeg.c index 479e063bd..3b9e0ec90 100644 --- a/libfreerdp/codec/dsp_ffmpeg.c +++ b/libfreerdp/codec/dsp_ffmpeg.c @@ -542,14 +542,16 @@ static BOOL ffmpeg_fill_frame(AVFrame* WINPR_RESTRICT frame, frame->sample_rate = (int)inputFormat->nSamplesPerSec; frame->format = ffmpeg_sample_format(inputFormat); - const int bpp = av_get_bytes_per_sample(frame->format); + const int bpp = + av_get_bytes_per_sample(WINPR_ASSERTING_INT_CAST(enum AVSampleFormat, frame->format)); WINPR_ASSERT(bpp >= 0); WINPR_ASSERT(size <= INT_MAX); const size_t nb_samples = size / inputFormat->nChannels / (size_t)bpp; frame->nb_samples = (int)nb_samples; - if ((ret = avcodec_fill_audio_frame(frame, inputFormat->nChannels, frame->format, data, - (int)size, 1)) < 0) + if ((ret = avcodec_fill_audio_frame( + frame, inputFormat->nChannels, + WINPR_ASSERTING_INT_CAST(enum AVSampleFormat, frame->format), data, (int)size, 1)) < 0) { const char* err = av_err2str(ret); WLog_ERR(TAG, "Error during audio frame fill %s [%d]", err, ret); From 47dfe2c6e60d77a5f551e2930324b60c3953c84f Mon Sep 17 00:00:00 2001 From: Armin Novak Date: Wed, 14 Jan 2026 10:30:20 +0100 Subject: [PATCH 05/17] [core,autodetect] fix Wimplicit-int-enum-cast warnings --- libfreerdp/core/autodetect.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/libfreerdp/core/autodetect.c b/libfreerdp/core/autodetect.c index 90f65ee53..b0cdde9cb 100644 --- a/libfreerdp/core/autodetect.c +++ b/libfreerdp/core/autodetect.c @@ -710,7 +710,9 @@ static BOOL autodetect_recv_netchar_sync(rdpAutoDetect* autodetect, RDP_TRANSPOR static BOOL autodetect_recv_netchar_request(rdpAutoDetect* autodetect, RDP_TRANSPORT_TYPE transport, wStream* s, const AUTODETECT_REQ_PDU* autodetectReqPdu) { - rdpNetworkCharacteristicsResult result = { 0 }; + rdpNetworkCharacteristicsResult result = { + .type = RDP_NETCHAR_RESERVED, .baseRTT = 0, .averageRTT = 0, .bandwidth = 0 + }; BOOL success = TRUE; WINPR_ASSERT(autodetect); From a098084d048ec8de7f48a473f9ea87d43a016809 Mon Sep 17 00:00:00 2001 From: Armin Novak Date: Wed, 14 Jan 2026 10:30:25 +0100 Subject: [PATCH 06/17] [core,nla] fix Wimplicit-int-enum-cast warnings --- libfreerdp/core/nla.c | 29 ++++++++++++++++++----------- 1 file changed, 18 insertions(+), 11 deletions(-) diff --git a/libfreerdp/core/nla.c b/libfreerdp/core/nla.c index 1b38f4b77..c51ec0549 100644 --- a/libfreerdp/core/nla.c +++ b/libfreerdp/core/nla.c @@ -1356,8 +1356,8 @@ typedef enum static BOOL nla_read_ts_credentials(rdpNla* nla, SecBuffer* data) { - WinPrAsn1Decoder dec = { 0 }; - WinPrAsn1Decoder dec2 = { 0 }; + WinPrAsn1Decoder dec = { .encoding = WINPR_ASN1_BER, { 0 } }; + WinPrAsn1Decoder dec2 = { .encoding = WINPR_ASN1_BER, { 0 } }; WinPrAsn1_OctetString credentials = { 0 }; BOOL error = FALSE; WinPrAsn1_INTEGER credType = -1; @@ -1424,7 +1424,7 @@ static BOOL nla_read_ts_credentials(rdpNla* nla, SecBuffer* data) settings->PasswordIsSmartcardPin = TRUE; /* cspData [1] TSCspDataDetail */ - WinPrAsn1Decoder cspDetails = { 0 }; + WinPrAsn1Decoder cspDetails = { .encoding = WINPR_ASN1_BER, { 0 } }; if (!WinPrAsn1DecReadContextualSequence(&dec, 1, &error, &cspDetails) && error) return FALSE; if (!nla_read_TSCspDataDetail(&cspDetails, settings)) @@ -1444,8 +1444,15 @@ static BOOL nla_read_ts_credentials(rdpNla* nla, SecBuffer* data) return FALSE; /* logonCred[0] TSRemoteGuardPackageCred */ - KERB_TICKET_LOGON kerbLogon = { 0 }; - WinPrAsn1Decoder logonCredsSeq = { 0 }; + KERB_TICKET_LOGON kerbLogon = { .MessageType = KerbInvalidValue, + .Flags = 0, + .ServiceTicketLength = 0, + .TicketGrantingTicketLength = 0, + .ServiceTicket = NULL, + .TicketGrantingTicket = NULL }; + + WinPrAsn1Decoder logonCredsSeq = { .encoding = WINPR_ASN1_BER, { 0 } }; + if (!WinPrAsn1DecReadContextualSequence(&dec2, 0, &error, &logonCredsSeq) || error) return FALSE; @@ -1468,16 +1475,16 @@ static BOOL nla_read_ts_credentials(rdpNla* nla, SecBuffer* data) /* supplementalCreds [1] SEQUENCE OF TSRemoteGuardPackageCred OPTIONAL, */ MSV1_0_REMOTE_SUPPLEMENTAL_CREDENTIAL* suppCreds = NULL; - WinPrAsn1Decoder suppCredsSeq = { 0 }; + WinPrAsn1Decoder suppCredsSeq = { .encoding = WINPR_ASN1_BER, { 0 } }; if (WinPrAsn1DecReadContextualSequence(&dec2, 1, &error, &suppCredsSeq) && Stream_GetRemainingLength(&suppCredsSeq.source)) { - WinPrAsn1Decoder ntlmCredsSeq = { 0 }; + WinPrAsn1Decoder ntlmCredsSeq = { .encoding = WINPR_ASN1_BER, { 0 } }; if (!WinPrAsn1DecReadSequence(&suppCredsSeq, &ntlmCredsSeq)) return FALSE; - RemoteGuardPackageCredType suppCredsType = { 0 }; + RemoteGuardPackageCredType suppCredsType = RCG_TYPE_NONE; wStream ntlmPayload = { 0 }; if (!nla_read_TSRemoteGuardPackageCred(nla, &ntlmCredsSeq, &suppCredsType, &ntlmPayload)) @@ -2059,8 +2066,8 @@ fail: static int nla_decode_ts_request(rdpNla* nla, wStream* s) { - WinPrAsn1Decoder dec = { 0 }; - WinPrAsn1Decoder dec2 = { 0 }; + WinPrAsn1Decoder dec = { .encoding = WINPR_ASN1_BER, { 0 } }; + WinPrAsn1Decoder dec2 = { .encoding = WINPR_ASN1_BER, { 0 } }; BOOL error = FALSE; WinPrAsn1_tagId tag = { 0 }; WinPrAsn1_INTEGER val = { 0 }; @@ -2102,7 +2109,7 @@ static int nla_decode_ts_request(rdpNla* nla, wStream* s) while (WinPrAsn1DecReadContextualTag(&dec, &tag, &dec2) != 0) { - WinPrAsn1Decoder dec3 = { 0 }; + WinPrAsn1Decoder dec3 = { .encoding = WINPR_ASN1_BER, { 0 } }; WinPrAsn1_OctetString octet_string = { 0 }; switch (tag) From a47631b772437fb85bbe0e74f3315e84a054d49b Mon Sep 17 00:00:00 2001 From: Armin Novak Date: Wed, 14 Jan 2026 10:30:29 +0100 Subject: [PATCH 07/17] [utils,encoded_types] fix Wimplicit-int-enum-cast warnings --- libfreerdp/utils/encoded_types.c | 24 ++++++++++++++++++++---- 1 file changed, 20 insertions(+), 4 deletions(-) diff --git a/libfreerdp/utils/encoded_types.c b/libfreerdp/utils/encoded_types.c index 1075eacbc..f419dd09a 100644 --- a/libfreerdp/utils/encoded_types.c +++ b/libfreerdp/utils/encoded_types.c @@ -65,9 +65,25 @@ typedef struct BYTE val4; } FOUR_BYTE_FLOAT; +static inline FOUR_BYTE_SIGNED_INTEGER FOUR_BYTE_SIGNED_INTEGER_init(void) +{ + const FOUR_BYTE_SIGNED_INTEGER empty = { + .c = ONE_BYTE_VAL, .s = POSITIVE_VAL, .val1 = 0, .val2 = 0, .val3 = 0, .val4 = 0 + }; + return empty; +} + +static inline FOUR_BYTE_FLOAT FOUR_BYTE_FLOAT_init(void) +{ + const FOUR_BYTE_FLOAT empty = { + .c = ONE_BYTE_VAL, .s = POSITIVE_VAL, .e = 0, .val1 = 0, .val2 = 0, .val3 = 0, .val4 = 0 + }; + return empty; +} + BOOL freerdp_read_four_byte_signed_integer(wStream* s, INT32* value) { - FOUR_BYTE_SIGNED_INTEGER si = { 0 }; + FOUR_BYTE_SIGNED_INTEGER si = FOUR_BYTE_SIGNED_INTEGER_init(); BYTE byte = 0; WINPR_ASSERT(s); @@ -125,7 +141,7 @@ BOOL freerdp_read_four_byte_signed_integer(wStream* s, INT32* value) BOOL freerdp_write_four_byte_signed_integer(wStream* s, INT32 value) { - FOUR_BYTE_SIGNED_INTEGER si = { 0 }; + FOUR_BYTE_SIGNED_INTEGER si = FOUR_BYTE_SIGNED_INTEGER_init(); WINPR_ASSERT(s); if (value > FREERDP_FOUR_BYTE_SIGNED_INT_MAX) @@ -212,7 +228,7 @@ BOOL freerdp_read_four_byte_float(wStream* s, double* value) BOOL freerdp_read_four_byte_float_exp(wStream* s, double* value, BYTE* exp) { - FOUR_BYTE_FLOAT f = { 0 }; + FOUR_BYTE_FLOAT f = FOUR_BYTE_FLOAT_init(); UINT32 base = 0; BYTE byte = 0; @@ -278,7 +294,7 @@ BOOL freerdp_read_four_byte_float_exp(wStream* s, double* value, BYTE* exp) BOOL freerdp_write_four_byte_float(wStream* s, double value) { - FOUR_BYTE_FLOAT si = { 0 }; + FOUR_BYTE_FLOAT si = FOUR_BYTE_FLOAT_init(); WINPR_ASSERT(s); From 305196b6bab8259ffc194703efa04f2dc11849a9 Mon Sep 17 00:00:00 2001 From: Armin Novak Date: Wed, 14 Jan 2026 10:30:34 +0100 Subject: [PATCH 08/17] [winpr,ncrypt] fix Wimplicit-int-enum-cast warnings --- winpr/libwinpr/ncrypt/ncrypt_pkcs11.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/winpr/libwinpr/ncrypt/ncrypt_pkcs11.c b/winpr/libwinpr/ncrypt/ncrypt_pkcs11.c index 5dcb251a7..37da1ca3a 100644 --- a/winpr/libwinpr/ncrypt/ncrypt_pkcs11.c +++ b/winpr/libwinpr/ncrypt/ncrypt_pkcs11.c @@ -879,8 +879,8 @@ static SECURITY_STATUS get_piv_container_name(NCryptP11KeyHandle* key, const BYT char container_name[PIV_CONTAINER_NAME_LEN + 1] = { 0 }; DWORD buf_len = 0; SECURITY_STATUS ret = NTE_BAD_KEY; - WinPrAsn1Decoder dec = { 0 }; - WinPrAsn1Decoder dec2 = { 0 }; + WinPrAsn1Decoder dec = { .encoding = WINPR_ASN1_BER, { 0 } }; + WinPrAsn1Decoder dec2 = { .encoding = WINPR_ASN1_BER, { 0 } }; size_t len = 0; BYTE tag = 0; BYTE* p = NULL; From b9f33c78cac26bf818715fa2c97abfff9f3c93b8 Mon Sep 17 00:00:00 2001 From: Armin Novak Date: Wed, 14 Jan 2026 10:30:39 +0100 Subject: [PATCH 09/17] [winpr,sspi] fix Wimplicit-int-enum-cast warnings --- winpr/libwinpr/sspi/Kerberos/kerberos.c | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/winpr/libwinpr/sspi/Kerberos/kerberos.c b/winpr/libwinpr/sspi/Kerberos/kerberos.c index a495b3dbf..68052abd8 100644 --- a/winpr/libwinpr/sspi/Kerberos/kerberos.c +++ b/winpr/libwinpr/sspi/Kerberos/kerberos.c @@ -711,7 +711,7 @@ static BOOL append(char* dst, size_t dstSize, const char* src) static BOOL kerberos_rd_tgt_req_tag2(WinPrAsn1Decoder* dec, char* buf, size_t len) { BOOL rc = FALSE; - WinPrAsn1Decoder seq = { 0 }; + WinPrAsn1Decoder seq = { .encoding = WINPR_ASN1_BER, { 0 } }; /* server-name [2] PrincipalName (SEQUENCE) */ if (!WinPrAsn1DecReadSequence(dec, &seq)) @@ -796,7 +796,7 @@ static BOOL kerberos_rd_tgt_req(WinPrAsn1Decoder* dec, char** target) if (len == 0) return TRUE; - WinPrAsn1Decoder dec2 = { 0 }; + WinPrAsn1Decoder dec2 = { .encoding = WINPR_ASN1_BER, { 0 } }; WinPrAsn1_tagId tag = 0; if (WinPrAsn1DecReadContextualTag(dec, &tag, &dec2) == 0) return FALSE; @@ -842,7 +842,7 @@ static BOOL kerberos_rd_tgt_rep(WinPrAsn1Decoder* dec, krb5_data* ticket) return FALSE; /* ticket [2] Ticket */ - WinPrAsn1Decoder asnTicket = { 0 }; + WinPrAsn1Decoder asnTicket = { .encoding = WINPR_ASN1_BER, { 0 } }; WinPrAsn1_tagId tag = 0; if (WinPrAsn1DecReadContextualTag(dec, &tag, &asnTicket) == 0) return FALSE; @@ -870,11 +870,11 @@ static BOOL kerberos_rd_tgt_token(const sspi_gss_data* token, char** target, krb if (target) *target = NULL; - WinPrAsn1Decoder der = { 0 }; + WinPrAsn1Decoder der = { .encoding = WINPR_ASN1_BER, { 0 } }; WinPrAsn1Decoder_InitMem(&der, WINPR_ASN1_DER, (BYTE*)token->data, token->length); /* KERB-TGT-REQUEST (SEQUENCE) */ - WinPrAsn1Decoder seq = { 0 }; + WinPrAsn1Decoder seq = { .encoding = WINPR_ASN1_BER, { 0 } }; if (!WinPrAsn1DecReadSequence(&der, &seq)) return FALSE; From 85b30cac1b1c561647917d5d8d238985418bad35 Mon Sep 17 00:00:00 2001 From: Armin Novak Date: Wed, 14 Jan 2026 10:30:55 +0100 Subject: [PATCH 10/17] [winpr,sspi] fix Wimplicit-int-enum-cast warnings --- winpr/libwinpr/sspi/Negotiate/negotiate.h | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/winpr/libwinpr/sspi/Negotiate/negotiate.h b/winpr/libwinpr/sspi/Negotiate/negotiate.h index 767e30a28..23677095f 100644 --- a/winpr/libwinpr/sspi/Negotiate/negotiate.h +++ b/winpr/libwinpr/sspi/Negotiate/negotiate.h @@ -47,6 +47,17 @@ typedef struct BOOL spnego; } NEGOTIATE_CONTEXT; +static inline NEGOTIATE_CONTEXT NEGOTIATE_CONTEXT_init(void) +{ + const NEGOTIATE_CONTEXT empty = { .state = NEGOTIATE_STATE_INITIAL, + .sub_context = { 0 }, + .mechTypes = { 0 }, + .mech = NULL, + .mic = FALSE, + .spnego = FALSE }; + return empty; +} + extern const SecPkgInfoA NEGOTIATE_SecPkgInfoA; extern const SecPkgInfoW NEGOTIATE_SecPkgInfoW; extern const SecurityFunctionTableA NEGOTIATE_SecurityFunctionTableA; From 9b29f73392b8ea4098425233e0a5d4e4b8db4b96 Mon Sep 17 00:00:00 2001 From: Armin Novak Date: Wed, 14 Jan 2026 10:31:06 +0100 Subject: [PATCH 11/17] [codec,yuv] fix Wimplicit-int-enum-cast warnings --- libfreerdp/codec/yuv.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/libfreerdp/codec/yuv.c b/libfreerdp/codec/yuv.c index e23b1ae28..3a1c9a360 100644 --- a/libfreerdp/codec/yuv.c +++ b/libfreerdp/codec/yuv.c @@ -32,7 +32,7 @@ typedef struct BYTE* pYUVDstData[3]; UINT32 iDstStride[3]; RECTANGLE_16 rect; - BYTE type; + avc444_frame_type type; } YUV_COMBINE_WORK_PARAM; typedef struct @@ -522,7 +522,7 @@ pool_decode_rect_param(const RECTANGLE_16* WINPR_RESTRICT rect, YUV_CONTEXT* WIN current.iDstStride[0] = iDstStride[0]; current.iDstStride[1] = iDstStride[1]; current.iDstStride[2] = iDstStride[2]; - current.type = type; + current.type = WINPR_ASSERTING_INT_CAST(avc444_frame_type, type); current.rect = *rect; return current; } From 70c72371cc7cf954a58417a78efab1b203be0d00 Mon Sep 17 00:00:00 2001 From: Armin Novak Date: Wed, 14 Jan 2026 10:31:11 +0100 Subject: [PATCH 12/17] [primitives] fix Wimplicit-int-enum-cast warnings --- libfreerdp/primitives/primitives.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libfreerdp/primitives/primitives.c b/libfreerdp/primitives/primitives.c index d97b6fbb8..b19cb53b9 100644 --- a/libfreerdp/primitives/primitives.c +++ b/libfreerdp/primitives/primitives.c @@ -206,7 +206,7 @@ static BOOL primitives_autodetect_best(primitives_t* prims) { const char* name; primitives_t* prims; - UINT32 flags; + primitive_hints flags; UINT32 count; }; From 25d6241e5761de24b87d4d91bc0469a693782f28 Mon Sep 17 00:00:00 2001 From: Armin Novak Date: Wed, 14 Jan 2026 10:31:16 +0100 Subject: [PATCH 13/17] [winpr,sspi] fix Wimplicit-int-enum-cast warnings --- winpr/libwinpr/sspi/Negotiate/negotiate.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/winpr/libwinpr/sspi/Negotiate/negotiate.c b/winpr/libwinpr/sspi/Negotiate/negotiate.c index 637cc4317..a63fc8002 100644 --- a/winpr/libwinpr/sspi/Negotiate/negotiate.c +++ b/winpr/libwinpr/sspi/Negotiate/negotiate.c @@ -676,7 +676,7 @@ static SECURITY_STATUS SEC_ENTRY negotiate_InitializeSecurityContextW( PCtxtHandle phNewContext, PSecBufferDesc pOutput, PULONG pfContextAttr, PTimeStamp ptsExpiry) { NEGOTIATE_CONTEXT* context = NULL; - NEGOTIATE_CONTEXT init_context = { 0 }; + NEGOTIATE_CONTEXT init_context = NEGOTIATE_CONTEXT_init(); MechCred* creds = NULL; PCtxtHandle sub_context = NULL; PCredHandle sub_cred = NULL; @@ -1022,7 +1022,7 @@ static SECURITY_STATUS SEC_ENTRY negotiate_AcceptSecurityContext( PTimeStamp ptsTimeStamp) { NEGOTIATE_CONTEXT* context = NULL; - NEGOTIATE_CONTEXT init_context = { 0 }; + NEGOTIATE_CONTEXT init_context = NEGOTIATE_CONTEXT_init(); MechCred* creds = NULL; PCredHandle sub_cred = NULL; NegToken input_token = empty_neg_token; From 43236f3847eb5e1dd564b2733009dbdba081d6ce Mon Sep 17 00:00:00 2001 From: Armin Novak Date: Wed, 14 Jan 2026 11:11:55 +0100 Subject: [PATCH 14/17] [core,gateway] update p_cont_def_result_t and bind_rejection_t * Add all currently defined values to enum p_cont_def_result_t * Modify [MS-RPCE] 2.2.2.5 New Reasons for Bind Rejection values to enum, add all currently defined values --- libfreerdp/core/gateway/rpc.h | 24 +++++++++++++++--------- 1 file changed, 15 insertions(+), 9 deletions(-) diff --git a/libfreerdp/core/gateway/rpc.h b/libfreerdp/core/gateway/rpc.h index 55abe469d..a8912efab 100644 --- a/libfreerdp/core/gateway/rpc.h +++ b/libfreerdp/core/gateway/rpc.h @@ -206,7 +206,8 @@ typedef enum { acceptance, user_rejection, - provider_rejection + provider_rejection, + negotiate_ack } p_cont_def_result_t; typedef enum @@ -253,14 +254,19 @@ typedef struct char* port_spec; /* port string spec; size_is(length) */ } port_any_t; -#define REASON_NOT_SPECIFIED 0 -#define TEMPORARY_CONGESTION 1 -#define LOCAL_LIMIT_EXCEEDED 2 -#define CALLED_PADDR_UNKNOWN 3 -#define PROTOCOL_VERSION_NOT_SUPPORTED 4 -#define DEFAULT_CONTEXT_NOT_SUPPORTED 5 -#define USER_DATA_NOT_READABLE 6 -#define NO_PSAP_AVAILABLE 7 +typedef enum +{ + REASON_NOT_SPECIFIED = 0, + TEMPORARY_CONGESTION = 1, + LOCAL_LIMIT_EXCEEDED = 2, + CALLED_PADDR_UNKNOWN = 3, + PROTOCOL_VERSION_NOT_SUPPORTED = 4, + DEFAULT_CONTEXT_NOT_SUPPORTED = 5, + USER_DATA_NOT_READABLE = 6, + NO_PSAP_AVAILABLE = 7, + authentication_type_not_recognized = 8, + invalid_checksum = 9 +} bind_rejection_t; typedef UINT16 rpcrt_reason_code_t; From 4bfda1d3082ad2db8a5a087279d33f7f3755e74c Mon Sep 17 00:00:00 2001 From: Armin Novak Date: Wed, 14 Jan 2026 11:13:18 +0100 Subject: [PATCH 15/17] [core,gateway] fix rts_read_result Add missing defined value to pass condition --- libfreerdp/core/gateway/rts.c | 1 + 1 file changed, 1 insertion(+) diff --git a/libfreerdp/core/gateway/rts.c b/libfreerdp/core/gateway/rts.c index 3039917ee..353a8403b 100644 --- a/libfreerdp/core/gateway/rts.c +++ b/libfreerdp/core/gateway/rts.c @@ -739,6 +739,7 @@ static BOOL rts_read_result(wStream* s, p_result_t* result, BOOL silent) case acceptance: case user_rejection: case provider_rejection: + case negotiate_ack: break; default: WLog_ERR(TAG, "Invalid p_cont_def_result_t %" PRIu16, res); From e710af3b4f69a0769e3b7d1cf5288b5aa5d603e0 Mon Sep 17 00:00:00 2001 From: Armin Novak Date: Wed, 14 Jan 2026 11:13:40 +0100 Subject: [PATCH 16/17] [core,gateway] add checks to tsg_ndr_read_packet_response Abort on unexpected offset value. --- libfreerdp/core/gateway/tsg.c | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/libfreerdp/core/gateway/tsg.c b/libfreerdp/core/gateway/tsg.c index ed9cec3e2..9b245e475 100644 --- a/libfreerdp/core/gateway/tsg.c +++ b/libfreerdp/core/gateway/tsg.c @@ -773,6 +773,13 @@ static BOOL tsg_ndr_read_packet_response(wLog* log, wStream* s, UINT32* index, return FALSE; } + if (MaxOffsetValue != 0) + { + WLog_Print(log, WLOG_ERROR, "Unexpected offset value: %" PRIu32 ", expected: 0", + MaxOffsetValue); + return FALSE; + } + if (!Stream_CheckAndLogRequiredLengthWLog(log, s, MaxSizeValue)) return FALSE; From 4e6aa32d19b1b200cd27e51ee7c3db1a665c50b5 Mon Sep 17 00:00:00 2001 From: Armin Novak Date: Wed, 14 Jan 2026 11:19:38 +0100 Subject: [PATCH 17/17] [core,multitransport] fix enum cast warning --- libfreerdp/core/multitransport.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/libfreerdp/core/multitransport.c b/libfreerdp/core/multitransport.c index 28b394b52..3fa9afe4b 100644 --- a/libfreerdp/core/multitransport.c +++ b/libfreerdp/core/multitransport.c @@ -184,7 +184,9 @@ state_run_t multitransport_recv_response(rdpMultitransport* multi, wStream* s) Stream_Read_UINT32(s, requestId); /* requestId (4 bytes) */ Stream_Read_UINT32(s, hr); /* hrResponse (4 bytes) */ - return IFCALLRESULT(STATE_RUN_SUCCESS, multi->MtResponse, multi, requestId, hr); + state_run_t res = STATE_RUN_SUCCESS; + IFCALLRET(multi->MtResponse, res, multi, requestId, hr); + return res; } static state_run_t multitransport_no_udp(rdpMultitransport* multi, UINT32 reqId,