diff --git a/libfreerdp/emu/scard/smartcard_emulate.c b/libfreerdp/emu/scard/smartcard_emulate.c index 8cd842396..156467467 100644 --- a/libfreerdp/emu/scard/smartcard_emulate.c +++ b/libfreerdp/emu/scard/smartcard_emulate.c @@ -51,6 +51,10 @@ struct smartcard_emulation_context wLog* log; wHashTable* contexts; wHashTable* handles; + BOOL configured; + const char* pem; + const char* key; + const char* pin; }; #define MAX_EMULATED_READERS 1 @@ -2682,24 +2686,31 @@ BOOL Emulate_IsConfigured(SmartcardEmulationContext* context) { BOOL rc = FALSE; vgidsContext* vgids; + const char* pem = NULL; + const char* key = NULL; + const char* pin = NULL; WINPR_ASSERT(context); + pem = freerdp_settings_get_string(context->settings, FreeRDP_SmartcardCertificate); + key = freerdp_settings_get_string(context->settings, FreeRDP_SmartcardPrivateKey); + + if (freerdp_settings_get_bool(context->settings, FreeRDP_PasswordIsSmartcardPin)) + pin = freerdp_settings_get_string(context->settings, FreeRDP_Password); + + /* Cache result only, if no initialization arguments changed. */ + if ((context->pem == pem) && (context->key == key) && (context->pin == pin)) + return context->configured; + + context->pem = pem; + context->key = key; + context->pin = pin; + vgids = vgids_new(); if (vgids) - { - const char* pem = - freerdp_settings_get_string(context->settings, FreeRDP_SmartcardCertificate); - const char* key = - freerdp_settings_get_string(context->settings, FreeRDP_SmartcardPrivateKey); - const char* pin = NULL; - - if (freerdp_settings_get_bool(context->settings, FreeRDP_PasswordIsSmartcardPin)) - pin = freerdp_settings_get_string(context->settings, FreeRDP_Password); - - rc = vgids_init(vgids, pem, key, pin); - } - + rc = vgids_init(vgids, context->pem, context->key, context->pin); vgids_free(vgids); + + context->configured = rc; return rc; } diff --git a/libfreerdp/utils/rdpdr_utils.c b/libfreerdp/utils/rdpdr_utils.c index db8634d70..fa87841ac 100644 --- a/libfreerdp/utils/rdpdr_utils.c +++ b/libfreerdp/utils/rdpdr_utils.c @@ -282,6 +282,7 @@ void rdpdr_dump_received_packet(wStream* s, const char* custom) UINT32 MajorFunction = 0; UINT32 MinorFunction = 0; const size_t pos = Stream_GetPosition(s); + wLog* log = WLog_Get(TAG); Stream_Read_UINT16(s, component); Stream_Read_UINT16(s, packetid); @@ -298,14 +299,14 @@ void rdpdr_dump_received_packet(wStream* s, const char* custom) Stream_Read_UINT32(s, MajorFunction); /* MajorFunction (4 bytes) */ Stream_Read_UINT32(s, MinorFunction); /* MinorFunction (4 bytes) */ - WLog_DBG(TAG, - "[%s] receive [%s | %s] [0x%08" PRIx32 "] FileID=0x%08" PRIx32 - ", CompletionID=0x%08" PRIx32 ", MajorFunction=%s [0x%08" PRIx32 - "] -> %" PRIuz, - custom, rdpdr_component_string(component), - rdpdr_packetid_string(packetid), deviceID, FileId, CompletionId, - rdpdr_irp_string(MajorFunction), MinorFunction, deviceID, - Stream_Length(s)); + WLog_Print(log, WLOG_DEBUG, + "[%s] receive [%s | %s] [0x%08" PRIx32 "] FileID=0x%08" PRIx32 + ", CompletionID=0x%08" PRIx32 ", MajorFunction=%s [0x%08" PRIx32 + "] -> %" PRIuz, + custom, rdpdr_component_string(component), + rdpdr_packetid_string(packetid), deviceID, FileId, CompletionId, + rdpdr_irp_string(MajorFunction), MinorFunction, deviceID, + Stream_Length(s)); done = TRUE; } } @@ -314,11 +315,11 @@ void rdpdr_dump_received_packet(wStream* s, const char* custom) if (!done) { - WLog_DBG(TAG, "[%s] receive [%s | %s] [0x%08" PRIx32 "] -> %" PRIuz, custom, - rdpdr_component_string(component), rdpdr_packetid_string(packetid), deviceID, - Stream_Length(s)); + WLog_Print(log, WLOG_DEBUG, "[%s] receive [%s | %s] [0x%08" PRIx32 "] -> %" PRIuz, + custom, rdpdr_component_string(component), rdpdr_packetid_string(packetid), + deviceID, Stream_Length(s)); } - winpr_HexDump(TAG, WLOG_TRACE, Stream_Buffer(s), Stream_Length(s)); + winpr_HexLogDump(log, WLOG_TRACE, Stream_Buffer(s), Stream_Length(s)); } Stream_SetPosition(s, pos); diff --git a/winpr/libwinpr/utils/print.c b/winpr/libwinpr/utils/print.c index 80c48f360..266818180 100644 --- a/winpr/libwinpr/utils/print.c +++ b/winpr/libwinpr/utils/print.c @@ -61,6 +61,9 @@ void winpr_HexLogDump(wLog* log, UINT32 lvl, const BYTE* data, size_t length) char* buffer; + if (!WLog_IsLevelActive(log, lvl)) + return; + if (!log || (maxlen < 0)) return;