From abd8da997e448ea1f1f7848ce194b1bdc7976f12 Mon Sep 17 00:00:00 2001 From: Raul Metsma Date: Mon, 8 Jun 2026 14:29:16 +0300 Subject: [PATCH] Fix possible UB WE2-1248 Signed-off-by: Raul Metsma --- .../include/pcsc-cpp/comp_winscard.hpp | 8 -------- lib/libpcsc-cpp/src/SmartCard.cpp | 17 ++++++++++------- 2 files changed, 10 insertions(+), 15 deletions(-) diff --git a/lib/libpcsc-cpp/include/pcsc-cpp/comp_winscard.hpp b/lib/libpcsc-cpp/include/pcsc-cpp/comp_winscard.hpp index 42a01c5..f6646f9 100644 --- a/lib/libpcsc-cpp/include/pcsc-cpp/comp_winscard.hpp +++ b/lib/libpcsc-cpp/include/pcsc-cpp/comp_winscard.hpp @@ -13,11 +13,7 @@ #undef IGNORE #endif -#ifdef __APPLE__ -#pragma pack(1) -#else #pragma pack(push, 1) -#endif #ifndef SCARD_CTL_CODE #define SCARD_CTL_CODE(code) (0x42000000 + (code)) @@ -129,8 +125,4 @@ struct PIN_VERIFY_STRUCTURE uint32_t ulDataLength; // length of Data to be sent to the ICC }; -#ifdef __APPLE__ -#pragma pack() -#else #pragma pack(pop) -#endif diff --git a/lib/libpcsc-cpp/src/SmartCard.cpp b/lib/libpcsc-cpp/src/SmartCard.cpp index c5287c9..244c277 100644 --- a/lib/libpcsc-cpp/src/SmartCard.cpp +++ b/lib/libpcsc-cpp/src/SmartCard.cpp @@ -66,7 +66,8 @@ class CardImpl if (auto ioctl = feature(FEATURE_GET_TLV_PROPERTIES); ioctl != features.cend()) { std::array buf {}; - SCard(Control, cardHandle, ioctl->value, nullptr, 0U, buf.data(), DWORD(buf.size()), + const DWORD controlCode = ioctl->value; + SCard(Control, cardHandle, controlCode, nullptr, 0U, buf.data(), DWORD(buf.size()), &size); for (auto p = buf.cbegin(); DWORD(std::distance(buf.cbegin(), p)) < size;) { auto tag = TLV_PROPERTIES(*p++); @@ -134,8 +135,9 @@ class CardImpl { uint8_t PINFrameOffset = 0; uint8_t PINLengthOffset = 0; - byte_vector cmd(sizeof(PIN_VERIFY_STRUCTURE)); - auto* data = (PIN_VERIFY_STRUCTURE*)cmd.data(); + const byte_vector& d = commandApdu; + byte_vector cmd(sizeof(PIN_VERIFY_STRUCTURE) + d.size()); + auto* data = new (cmd.data()) PIN_VERIFY_STRUCTURE {}; data->bTimerOut = PIN_PAD_PIN_ENTRY_TIMEOUT; data->bTimerOut2 = PIN_PAD_PIN_ENTRY_TIMEOUT; data->bmFormatString = @@ -147,21 +149,22 @@ class CardImpl data->bNumberMessage = CCIDDefaultInvitationMessage; data->wLangId = lang; data->bMsgIndex = NoInvitationMessage; - const byte_vector& d = commandApdu; data->ulDataLength = uint32_t(d.size()); - cmd.insert(cmd.cend(), d.cbegin(), d.cend()); + std::copy(d.cbegin(), d.cend(), cmd.begin() + sizeof(PIN_VERIFY_STRUCTURE)); auto ioctl = feature(FEATURE_VERIFY_PIN_START); if (feature(FEATURE_VERIFY_PIN_START) == features.cend()) ioctl = feature(FEATURE_VERIFY_PIN_DIRECT); byte_vector responseBytes(ResponseApdu::MAX_SIZE, 0); auto responseLength = DWORD(responseBytes.size()); - SCard(Control, cardHandle, ioctl->value, cmd.data(), DWORD(cmd.size()), + const DWORD controlCode = ioctl->value; + SCard(Control, cardHandle, controlCode, cmd.data(), DWORD(cmd.size()), LPVOID(responseBytes.data()), DWORD(responseBytes.size()), &responseLength); if (auto finish = feature(FEATURE_VERIFY_PIN_FINISH); finish != features.cend()) { responseLength = DWORD(responseBytes.size()); - SCard(Control, cardHandle, finish->value, nullptr, 0U, LPVOID(responseBytes.data()), + const DWORD finishControlCode = finish->value; + SCard(Control, cardHandle, finishControlCode, nullptr, 0U, LPVOID(responseBytes.data()), DWORD(responseBytes.size()), &responseLength); }