From d690ea0cb26b5080d435de964fb181066b8ed4b7 Mon Sep 17 00:00:00 2001 From: akallabeth Date: Tue, 10 Jun 2025 14:07:04 +0200 Subject: [PATCH] [utils,smartcard] fix possible assertion --- libfreerdp/core/gcc.c | 2 +- libfreerdp/utils/smartcard_call.c | 14 +++++++++----- 2 files changed, 10 insertions(+), 6 deletions(-) diff --git a/libfreerdp/core/gcc.c b/libfreerdp/core/gcc.c index 8d83d7c5b..1d741b77e 100644 --- a/libfreerdp/core/gcc.c +++ b/libfreerdp/core/gcc.c @@ -1881,7 +1881,7 @@ BOOL gcc_read_client_network_data(wStream* s, rdpMcs* mcs) Stream_Read_UINT32(s, mcs->channelCount); /* channelCount */ - if (!Stream_CheckAndLogRequiredLengthWLog(mcs->log, s, mcs->channelCount * 12)) + if (!Stream_CheckAndLogRequiredLengthOfSizeWLog(mcs->log, s, mcs->channelCount, 12ull)) return FALSE; if (mcs->channelCount > CHANNEL_MAX_COUNT) diff --git a/libfreerdp/utils/smartcard_call.c b/libfreerdp/utils/smartcard_call.c index b66030664..3f5ffaa8c 100644 --- a/libfreerdp/utils/smartcard_call.c +++ b/libfreerdp/utils/smartcard_call.c @@ -1319,6 +1319,7 @@ static LONG smartcard_StatusW_Call(scard_call_context* smartcard, wStream* out, if ((ret.ReturnCode == SCARD_S_SUCCESS) && (ret.cBytes == SCARD_AUTOALLOCATE)) return SCARD_F_UNKNOWN_ERROR; + size_t blen = 0; if (status == SCARD_S_SUCCESS) { if (!call->fmszReaderNamesIsNULL) @@ -1327,11 +1328,14 @@ static LONG smartcard_StatusW_Call(scard_call_context* smartcard, wStream* out, ret.cbAtrLen = cbAtrLen; } - /* SCardStatusW returns number of characters, we need number of bytes */ - WINPR_ASSERT(ret.cBytes < SCARD_AUTOALLOCATE / sizeof(WCHAR)); - const size_t blen = sizeof(WCHAR) * ret.cBytes; - WINPR_ASSERT(blen <= UINT32_MAX); - ret.cBytes = (UINT32)blen; + if (ret.cBytes != SCARD_AUTOALLOCATE) + { + /* SCardStatusW returns number of characters, we need number of bytes */ + WINPR_ASSERT(ret.cBytes < SCARD_AUTOALLOCATE / sizeof(WCHAR)); + blen = sizeof(WCHAR) * ret.cBytes; + WINPR_ASSERT(blen <= UINT32_MAX); + ret.cBytes = (UINT32)blen; + } status = smartcard_pack_status_return(out, &ret, TRUE); if (status != SCARD_S_SUCCESS)