From 208bcbd153e4caf1248db49cfc913c3cba97e9cf Mon Sep 17 00:00:00 2001 From: Armin Novak Date: Tue, 24 Feb 2026 21:23:47 +0100 Subject: [PATCH] [winpr] Add initializer functions * Add initializer for wStream * Add initializer for ASN1 decoder --- channels/rdpear/client/rdpear_main.c | 18 +++++++++--------- libfreerdp/core/nla.c | 18 +++++++++--------- winpr/include/winpr/asn1.h | 12 ++++++++++++ winpr/include/winpr/stream.h | 11 +++++++++++ winpr/libwinpr/ncrypt/ncrypt_pkcs11.c | 4 ++-- winpr/libwinpr/sspi/Kerberos/kerberos.c | 10 +++++----- winpr/libwinpr/sspi/Negotiate/negotiate.c | 12 ++++++------ winpr/libwinpr/sspi/sspi_gss.c | 4 ++-- winpr/libwinpr/utils/asn1/asn1.c | 10 +++++----- winpr/libwinpr/utils/test/TestASN1.c | 4 ++-- 10 files changed, 63 insertions(+), 40 deletions(-) diff --git a/channels/rdpear/client/rdpear_main.c b/channels/rdpear/client/rdpear_main.c index 5b4aae0d9..179a3295c 100644 --- a/channels/rdpear/client/rdpear_main.c +++ b/channels/rdpear/client/rdpear_main.c @@ -394,9 +394,9 @@ static char* KERB_RPC_UNICODESTR_to_charptr(const RPC_UNICODE_STRING* src) static BOOL extractAuthData(const KERB_ASN1_DATA* src, krb5_authdata* authData, BOOL* haveData) { - WinPrAsn1Decoder dec = { .encoding = WINPR_ASN1_BER, { 0 } }; - WinPrAsn1Decoder dec2 = { .encoding = WINPR_ASN1_BER, { 0 } }; - WinPrAsn1Decoder dec3 = { .encoding = WINPR_ASN1_BER, { 0 } }; + WinPrAsn1Decoder dec = WinPrAsn1Decoder_init(); + WinPrAsn1Decoder dec2 = WinPrAsn1Decoder_init(); + WinPrAsn1Decoder dec3 = WinPrAsn1Decoder_init(); WinPrAsn1Decoder_InitMem(&dec, WINPR_ASN1_DER, src->Asn1Buffer, src->Asn1BufferHints.count); BOOL error = FALSE; WinPrAsn1_INTEGER adType = 0; @@ -429,8 +429,8 @@ static BOOL extractAuthData(const KERB_ASN1_DATA* src, krb5_authdata* authData, static BOOL extractChecksum(const KERB_ASN1_DATA* src, krb5_checksum* dst) { - WinPrAsn1Decoder dec = { .encoding = WINPR_ASN1_BER, { 0 } }; - WinPrAsn1Decoder dec2 = { .encoding = WINPR_ASN1_BER, { 0 } }; + WinPrAsn1Decoder dec = WinPrAsn1Decoder_init(); + WinPrAsn1Decoder dec2 = WinPrAsn1Decoder_init(); WinPrAsn1Decoder_InitMem(&dec, WINPR_ASN1_DER, src->Asn1Buffer, src->Asn1BufferHints.count); BOOL error = FALSE; WinPrAsn1_OctetString os; @@ -626,8 +626,8 @@ out: static BOOL rdpear_findEncryptedData(const KERB_ASN1_DATA* src, int* penctype, krb5_data* data) { - WinPrAsn1Decoder dec = { .encoding = WINPR_ASN1_BER, { 0 } }; - WinPrAsn1Decoder dec2 = { .encoding = WINPR_ASN1_BER, { 0 } }; + WinPrAsn1Decoder dec = WinPrAsn1Decoder_init(); + WinPrAsn1Decoder dec2 = WinPrAsn1Decoder_init(); WinPrAsn1Decoder_InitMem(&dec, WINPR_ASN1_DER, src->Asn1Buffer, src->Asn1BufferHints.count); BOOL error = FALSE; WinPrAsn1_INTEGER encType = 0; @@ -974,8 +974,8 @@ static UINT rdpear_on_data_received(IWTSVirtualChannelCallback* pChannelCallback if (!freerdp_nla_decrypt(rdpear->rdp_context, &inBuffer, &decrypted)) goto out; - WinPrAsn1Decoder dec = { .encoding = WINPR_ASN1_BER, { 0 } }; - WinPrAsn1Decoder dec2 = { .encoding = WINPR_ASN1_BER, { 0 } }; + WinPrAsn1Decoder dec = WinPrAsn1Decoder_init(); + WinPrAsn1Decoder dec2 = WinPrAsn1Decoder_init(); wStream decodedStream = WINPR_C_ARRAY_INIT; Stream_StaticInit(&decodedStream, decrypted.pvBuffer, decrypted.cbBuffer); WinPrAsn1Decoder_Init(&dec, WINPR_ASN1_DER, &decodedStream); diff --git a/libfreerdp/core/nla.c b/libfreerdp/core/nla.c index 704a2d348..12fad8d00 100644 --- a/libfreerdp/core/nla.c +++ b/libfreerdp/core/nla.c @@ -1355,8 +1355,8 @@ typedef enum static BOOL nla_read_ts_credentials(rdpNla* nla, SecBuffer* data) { - WinPrAsn1Decoder dec = { .encoding = WINPR_ASN1_BER, { 0 } }; - WinPrAsn1Decoder dec2 = { .encoding = WINPR_ASN1_BER, { 0 } }; + WinPrAsn1Decoder dec = WinPrAsn1Decoder_init(); + WinPrAsn1Decoder dec2 = WinPrAsn1Decoder_init(); WinPrAsn1_OctetString credentials = WINPR_C_ARRAY_INIT; BOOL error = FALSE; WinPrAsn1_INTEGER credType = -1; @@ -1423,7 +1423,7 @@ static BOOL nla_read_ts_credentials(rdpNla* nla, SecBuffer* data) settings->PasswordIsSmartcardPin = TRUE; /* cspData [1] TSCspDataDetail */ - WinPrAsn1Decoder cspDetails = { .encoding = WINPR_ASN1_BER, { 0 } }; + WinPrAsn1Decoder cspDetails = WinPrAsn1Decoder_init(); if (!WinPrAsn1DecReadContextualSequence(&dec, 1, &error, &cspDetails) && error) return FALSE; if (!nla_read_TSCspDataDetail(&cspDetails, settings)) @@ -1450,7 +1450,7 @@ static BOOL nla_read_ts_credentials(rdpNla* nla, SecBuffer* data) .ServiceTicket = NULL, .TicketGrantingTicket = NULL }; - WinPrAsn1Decoder logonCredsSeq = { .encoding = WINPR_ASN1_BER, { 0 } }; + WinPrAsn1Decoder logonCredsSeq = WinPrAsn1Decoder_init(); if (!WinPrAsn1DecReadContextualSequence(&dec2, 0, &error, &logonCredsSeq) || error) return FALSE; @@ -1474,12 +1474,12 @@ 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 = { .encoding = WINPR_ASN1_BER, { 0 } }; + WinPrAsn1Decoder suppCredsSeq = WinPrAsn1Decoder_init(); if (WinPrAsn1DecReadContextualSequence(&dec2, 1, &error, &suppCredsSeq) && Stream_GetRemainingLength(&suppCredsSeq.source)) { - WinPrAsn1Decoder ntlmCredsSeq = { .encoding = WINPR_ASN1_BER, { 0 } }; + WinPrAsn1Decoder ntlmCredsSeq = WinPrAsn1Decoder_init(); if (!WinPrAsn1DecReadSequence(&suppCredsSeq, &ntlmCredsSeq)) return FALSE; @@ -2065,8 +2065,8 @@ fail: static int nla_decode_ts_request(rdpNla* nla, wStream* s) { - WinPrAsn1Decoder dec = { .encoding = WINPR_ASN1_BER, { 0 } }; - WinPrAsn1Decoder dec2 = { .encoding = WINPR_ASN1_BER, { 0 } }; + WinPrAsn1Decoder dec = WinPrAsn1Decoder_init(); + WinPrAsn1Decoder dec2 = WinPrAsn1Decoder_init(); BOOL error = FALSE; WinPrAsn1_tagId tag = WINPR_C_ARRAY_INIT; WinPrAsn1_INTEGER val = WINPR_C_ARRAY_INIT; @@ -2108,7 +2108,7 @@ static int nla_decode_ts_request(rdpNla* nla, wStream* s) while (WinPrAsn1DecReadContextualTag(&dec, &tag, &dec2) != 0) { - WinPrAsn1Decoder dec3 = { .encoding = WINPR_ASN1_BER, { 0 } }; + WinPrAsn1Decoder dec3 = WinPrAsn1Decoder_init(); WinPrAsn1_OctetString octet_string = WINPR_C_ARRAY_INIT; switch (tag) diff --git a/winpr/include/winpr/asn1.h b/winpr/include/winpr/asn1.h index 75556eb3d..84ed76f79 100644 --- a/winpr/include/winpr/asn1.h +++ b/winpr/include/winpr/asn1.h @@ -68,6 +68,18 @@ struct WinPrAsn1Decoder typedef struct WinPrAsn1Decoder WinPrAsn1Decoder; +/** @brief helper initializing a \b WinPrAsn1Decoder context + * + * @return The initialized context + * @since version 3.24.0 + */ +static inline WinPrAsn1Decoder WinPrAsn1Decoder_init(void) +{ + const wStream stream = Stream_Init(); + const WinPrAsn1Decoder empty = { WINPR_ASN1_BER, stream }; + return empty; +} + typedef BYTE WinPrAsn1_tag; typedef BYTE WinPrAsn1_tagId; typedef BOOL WinPrAsn1_BOOL; diff --git a/winpr/include/winpr/stream.h b/winpr/include/winpr/stream.h index b3cd0c55f..b6833ad69 100644 --- a/winpr/include/winpr/stream.h +++ b/winpr/include/winpr/stream.h @@ -51,6 +51,17 @@ extern "C" BOOL isOwner; } wStream; + /** @brief helper initializing a \b wStream context + * + * @return The initialized context + * @since version 3.24.0 + */ + static inline wStream Stream_Init(void) + { + const wStream empty = { NULL, NULL, 0, 0, 0, NULL, FALSE, FALSE }; + return empty; + } + static inline size_t Stream_Capacity(const wStream* _s); WINPR_API size_t Stream_GetRemainingCapacity(const wStream* _s); WINPR_API size_t Stream_GetRemainingLength(const wStream* _s); diff --git a/winpr/libwinpr/ncrypt/ncrypt_pkcs11.c b/winpr/libwinpr/ncrypt/ncrypt_pkcs11.c index 75e9b8b53..04523fe6f 100644 --- a/winpr/libwinpr/ncrypt/ncrypt_pkcs11.c +++ b/winpr/libwinpr/ncrypt/ncrypt_pkcs11.c @@ -875,8 +875,8 @@ static SECURITY_STATUS get_piv_container_name(NCryptP11KeyHandle* key, const BYT char container_name[PIV_CONTAINER_NAME_LEN + 1] = WINPR_C_ARRAY_INIT; DWORD buf_len = 0; SECURITY_STATUS ret = NTE_BAD_KEY; - WinPrAsn1Decoder dec = { .encoding = WINPR_ASN1_BER, { 0 } }; - WinPrAsn1Decoder dec2 = { .encoding = WINPR_ASN1_BER, { 0 } }; + WinPrAsn1Decoder dec = WinPrAsn1Decoder_init(); + WinPrAsn1Decoder dec2 = WinPrAsn1Decoder_init(); size_t len = 0; BYTE tag = 0; BYTE* p = NULL; diff --git a/winpr/libwinpr/sspi/Kerberos/kerberos.c b/winpr/libwinpr/sspi/Kerberos/kerberos.c index c3a31192f..fcab46697 100644 --- a/winpr/libwinpr/sspi/Kerberos/kerberos.c +++ b/winpr/libwinpr/sspi/Kerberos/kerberos.c @@ -725,7 +725,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 = { .encoding = WINPR_ASN1_BER, { 0 } }; + WinPrAsn1Decoder seq = WinPrAsn1Decoder_init(); /* server-name [2] PrincipalName (SEQUENCE) */ if (!WinPrAsn1DecReadSequence(dec, &seq)) @@ -810,7 +810,7 @@ static BOOL kerberos_rd_tgt_req(WinPrAsn1Decoder* dec, char** target) if (len == 0) return TRUE; - WinPrAsn1Decoder dec2 = { .encoding = WINPR_ASN1_BER, { 0 } }; + WinPrAsn1Decoder dec2 = WinPrAsn1Decoder_init(); WinPrAsn1_tagId tag = 0; if (WinPrAsn1DecReadContextualTag(dec, &tag, &dec2) == 0) return FALSE; @@ -856,7 +856,7 @@ static BOOL kerberos_rd_tgt_rep(WinPrAsn1Decoder* dec, krb5_data* ticket) return FALSE; /* ticket [2] Ticket */ - WinPrAsn1Decoder asnTicket = { .encoding = WINPR_ASN1_BER, { 0 } }; + WinPrAsn1Decoder asnTicket = WinPrAsn1Decoder_init(); WinPrAsn1_tagId tag = 0; if (WinPrAsn1DecReadContextualTag(dec, &tag, &asnTicket) == 0) return FALSE; @@ -884,11 +884,11 @@ static BOOL kerberos_rd_tgt_token(const sspi_gss_data* token, char** target, krb if (target) *target = NULL; - WinPrAsn1Decoder der = { .encoding = WINPR_ASN1_BER, { 0 } }; + WinPrAsn1Decoder der = WinPrAsn1Decoder_init(); WinPrAsn1Decoder_InitMem(&der, WINPR_ASN1_DER, (BYTE*)token->data, token->length); /* KERB-TGT-REQUEST (SEQUENCE) */ - WinPrAsn1Decoder seq = { .encoding = WINPR_ASN1_BER, { 0 } }; + WinPrAsn1Decoder seq = WinPrAsn1Decoder_init(); if (!WinPrAsn1DecReadSequence(&der, &seq)) return FALSE; diff --git a/winpr/libwinpr/sspi/Negotiate/negotiate.c b/winpr/libwinpr/sspi/Negotiate/negotiate.c index c0b8438cc..964119ff3 100644 --- a/winpr/libwinpr/sspi/Negotiate/negotiate.c +++ b/winpr/libwinpr/sspi/Negotiate/negotiate.c @@ -477,8 +477,8 @@ cleanup: static BOOL negotiate_read_neg_token(PSecBuffer input, NegToken* token) { - WinPrAsn1Decoder dec = { .encoding = WINPR_ASN1_BER, { 0 } }; - WinPrAsn1Decoder dec2 = { .encoding = WINPR_ASN1_BER, { 0 } }; + WinPrAsn1Decoder dec = WinPrAsn1Decoder_init(); + WinPrAsn1Decoder dec2 = WinPrAsn1Decoder_init(); WinPrAsn1_OID oid = WINPR_C_ARRAY_INIT; WinPrAsn1_tagId contextual = 0; WinPrAsn1_tag tag = 0; @@ -990,8 +990,8 @@ static SECURITY_STATUS SEC_ENTRY negotiate_InitializeSecurityContextA( static const Mech* guessMech(PSecBuffer input_buffer, BOOL* spNego, WinPrAsn1_OID* oid) { - WinPrAsn1Decoder decoder = { .encoding = WINPR_ASN1_BER, { 0 } }; - WinPrAsn1Decoder appDecoder = { .encoding = WINPR_ASN1_BER, { 0 } }; + WinPrAsn1Decoder decoder = WinPrAsn1Decoder_init(); + WinPrAsn1Decoder appDecoder = WinPrAsn1Decoder_init(); WinPrAsn1_tagId tag = 0; const char ssp[] = "NTLMSSP"; @@ -1039,8 +1039,8 @@ static SECURITY_STATUS SEC_ENTRY negotiate_AcceptSecurityContext( SecBufferDesc mech_input = { SECBUFFER_VERSION, 1, &input_token.mechToken }; SecBufferDesc mech_output = { SECBUFFER_VERSION, 1, &output_token.mechToken }; SECURITY_STATUS status = SEC_E_INTERNAL_ERROR; - WinPrAsn1Decoder dec = { .encoding = WINPR_ASN1_BER, { 0 } }; - WinPrAsn1Decoder dec2 = { .encoding = WINPR_ASN1_BER, { 0 } }; + WinPrAsn1Decoder dec = WinPrAsn1Decoder_init(); + WinPrAsn1Decoder dec2 = WinPrAsn1Decoder_init(); WinPrAsn1_tagId tag = 0; WinPrAsn1_OID oid = WINPR_C_ARRAY_INIT; const Mech* first_mech = NULL; diff --git a/winpr/libwinpr/sspi/sspi_gss.c b/winpr/libwinpr/sspi/sspi_gss.c index 7d0ef6c9b..cfd0b0599 100644 --- a/winpr/libwinpr/sspi/sspi_gss.c +++ b/winpr/libwinpr/sspi/sspi_gss.c @@ -86,8 +86,8 @@ cleanup: BOOL sspi_gss_unwrap_token(const SecBuffer* buf, WinPrAsn1_OID* oid, uint16_t* tok_id, sspi_gss_data* token) { - WinPrAsn1Decoder dec = { .encoding = WINPR_ASN1_BER, { 0 } }; - WinPrAsn1Decoder dec2 = { .encoding = WINPR_ASN1_BER, { 0 } }; + WinPrAsn1Decoder dec = WinPrAsn1Decoder_init(); + WinPrAsn1Decoder dec2 = WinPrAsn1Decoder_init(); WinPrAsn1_tagId tag = 0; wStream sbuffer = WINPR_C_ARRAY_INIT; wStream* s = NULL; diff --git a/winpr/libwinpr/utils/asn1/asn1.c b/winpr/libwinpr/utils/asn1/asn1.c index 7626648b0..275e6ddf4 100644 --- a/winpr/libwinpr/utils/asn1/asn1.c +++ b/winpr/libwinpr/utils/asn1/asn1.c @@ -1388,7 +1388,7 @@ size_t WinPrAsn1DecReadContextualBool(WinPrAsn1Decoder* dec, WinPrAsn1_tagId tag { size_t ret = 0; size_t ret2 = 0; - WinPrAsn1Decoder content = { .encoding = WINPR_ASN1_BER, { 0 } }; + WinPrAsn1Decoder content = WinPrAsn1Decoder_init(); ret = readContextualHeader(dec, tagId, error, &content); if (!ret) @@ -1410,7 +1410,7 @@ size_t WinPrAsn1DecReadContextualInteger(WinPrAsn1Decoder* dec, WinPrAsn1_tagId { size_t ret = 0; size_t ret2 = 0; - WinPrAsn1Decoder content = { .encoding = WINPR_ASN1_BER, { 0 } }; + WinPrAsn1Decoder content = WinPrAsn1Decoder_init(); ret = readContextualHeader(dec, tagId, error, &content); if (!ret) @@ -1432,7 +1432,7 @@ size_t WinPrAsn1DecReadContextualOID(WinPrAsn1Decoder* dec, WinPrAsn1_tagId tagI { size_t ret = 0; size_t ret2 = 0; - WinPrAsn1Decoder content = { .encoding = WINPR_ASN1_BER, { 0 } }; + WinPrAsn1Decoder content = WinPrAsn1Decoder_init(); ret = readContextualHeader(dec, tagId, error, &content); if (!ret) @@ -1455,7 +1455,7 @@ size_t WinPrAsn1DecReadContextualOctetString(WinPrAsn1Decoder* dec, WinPrAsn1_ta { size_t ret = 0; size_t ret2 = 0; - WinPrAsn1Decoder content = { .encoding = WINPR_ASN1_BER, { 0 } }; + WinPrAsn1Decoder content = WinPrAsn1Decoder_init(); ret = readContextualHeader(dec, tagId, error, &content); if (!ret) @@ -1477,7 +1477,7 @@ size_t WinPrAsn1DecReadContextualSequence(WinPrAsn1Decoder* dec, WinPrAsn1_tagId { size_t ret = 0; size_t ret2 = 0; - WinPrAsn1Decoder content = { .encoding = WINPR_ASN1_BER, { 0 } }; + WinPrAsn1Decoder content = WinPrAsn1Decoder_init(); ret = readContextualHeader(dec, tagId, error, &content); if (!ret) diff --git a/winpr/libwinpr/utils/test/TestASN1.c b/winpr/libwinpr/utils/test/TestASN1.c index 9b0a23db2..2b936d0d5 100644 --- a/winpr/libwinpr/utils/test/TestASN1.c +++ b/winpr/libwinpr/utils/test/TestASN1.c @@ -30,8 +30,8 @@ static const BYTE utctimeContent[] = { 0x17, 0x0D, 0x32, 0x31, 0x30, 0x33, 0x31, int TestASN1Read(int argc, char* argv[]) { - WinPrAsn1Decoder decoder = { .encoding = WINPR_ASN1_BER, { 0 } }; - WinPrAsn1Decoder seqDecoder = { .encoding = WINPR_ASN1_BER, { 0 } }; + WinPrAsn1Decoder decoder = WinPrAsn1Decoder_init(); + WinPrAsn1Decoder seqDecoder = WinPrAsn1Decoder_init(); wStream staticS = WINPR_C_ARRAY_INIT; WinPrAsn1_BOOL boolV = 0; WinPrAsn1_INTEGER integerV = 0;