if (!call->Common.fPbDataIsNULL)
{
ret.cbDataLen = call->Common.cbDataLen;
- if (autoalloc)
+ if (!autoalloc)
{
ret.pbData = malloc(ret.cbDataLen);
if (!ret.pbData)
ret.ReturnCode = SCardReadCacheA(operation->hContext, call->Common.CardIdentifier,
call->Common.FreshnessCounter, call->szLookupName,
ret.pbData, &ret.cbDataLen);
- log_status_error(TAG, "SCardReadCacheA", ret.ReturnCode);
+ if ((ret.ReturnCode != SCARD_W_CACHE_ITEM_NOT_FOUND) &&
+ (ret.ReturnCode != SCARD_W_CACHE_ITEM_STALE))
+ {
+ log_status_error(TAG, "SCardReadCacheA", ret.ReturnCode);
+ }
free(call->szLookupName);
free(call->Common.CardIdentifier);
if (!call->Common.fPbDataIsNULL)
{
ret.cbDataLen = call->Common.cbDataLen;
- if (autoalloc)
+ if (!autoalloc)
{
ret.pbData = malloc(ret.cbDataLen);
if (!ret.pbData)
ret.ReturnCode = SCardReadCacheW(operation->hContext, call->Common.CardIdentifier,
call->Common.FreshnessCounter, call->szLookupName,
ret.pbData, &ret.cbDataLen);
- log_status_error(TAG, "SCardReadCacheW", ret.ReturnCode);
+ if ((ret.ReturnCode != SCARD_W_CACHE_ITEM_NOT_FOUND) &&
+ (ret.ReturnCode != SCARD_W_CACHE_ITEM_STALE))
+ {
+ log_status_error(TAG, "SCardReadCacheA", ret.ReturnCode);
+ }
free(call->szLookupName);
free(call->Common.CardIdentifier);
}
if ((result != SCARD_S_SUCCESS) && (result != SCARD_E_TIMEOUT) &&
- (result != SCARD_E_NO_READERS_AVAILABLE) && (result != SCARD_E_NO_SERVICE))
+ (result != SCARD_E_NO_READERS_AVAILABLE) && (result != SCARD_E_NO_SERVICE) &&
+ (result != SCARD_W_CACHE_ITEM_NOT_FOUND) && (result != SCARD_W_CACHE_ITEM_STALE))
{
WLog_WARN(TAG, "IRP failure: %s (0x%08" PRIX32 "), status: %s (0x%08" PRIX32 ")",
smartcard_get_ioctl_string(ioControlCode, TRUE), ioControlCode,
if (ret->ReturnCode == SCARD_S_SUCCESS)
{
+ char buffer[1024];
WLog_LVL(TAG, g_LogLevel, " cbDataLen=%" PRId32, ret->cbDataLen);
+ WLog_LVL(TAG, g_LogLevel, " cbData: %s",
+ smartcard_array_dump(ret->pbData, ret->cbDataLen, buffer, sizeof(buffer)));
}
WLog_LVL(TAG, g_LogLevel, "}");
}
typedef struct
{
DWORD len;
+ DWORD freshness;
BYTE* data;
} PCSC_CACHE_ITEM;
if (!pContext->cache)
goto errors;
+ pContext->cache->hash = HashTable_StringHash;
+ pContext->cache->keyCompare = HashTable_StringCompare;
+ pContext->cache->keyClone = HashTable_StringClone;
pContext->cache->keyFree = free;
pContext->cache->valueFree = pcsc_cache_item_free;
if (!g_CardContexts)
PCSC_CACHE_ITEM* data;
PCSC_SCARDCONTEXT* ctx = PCSC_GetCardContextData(hContext);
char* id = card_id_and_name_a(CardIdentifier, LookupName);
- WINPR_UNUSED(FreshnessCounter);
data = HashTable_GetItemValue(ctx->cache, id);
free(id);
if (!data)
{
*DataLen = 0;
- return SCARD_S_SUCCESS;
+ return SCARD_W_CACHE_ITEM_NOT_FOUND;
+ }
+
+ if (FreshnessCounter != data->freshness)
+ {
+ *DataLen = 0;
+ return SCARD_W_CACHE_ITEM_STALE;
}
if (*DataLen == SCARD_AUTOALLOCATE)
PCSC_CACHE_ITEM* data;
PCSC_SCARDCONTEXT* ctx = PCSC_GetCardContextData(hContext);
char* id = card_id_and_name_w(CardIdentifier, LookupName);
- WINPR_UNUSED(FreshnessCounter);
data = HashTable_GetItemValue(ctx->cache, id);
free(id);
if (!data)
{
*DataLen = 0;
- return SCARD_S_SUCCESS;
+ return SCARD_W_CACHE_ITEM_NOT_FOUND;
+ }
+
+ if (FreshnessCounter != data->freshness)
+ {
+ *DataLen = 0;
+ return SCARD_W_CACHE_ITEM_STALE;
}
if (*DataLen == SCARD_AUTOALLOCATE)
PCSC_SCARDCONTEXT* ctx = PCSC_GetCardContextData(hContext);
char* id = card_id_and_name_a(CardIdentifier, LookupName);
- WINPR_UNUSED(FreshnessCounter);
-
if (!id)
return SCARD_E_NO_MEMORY;
return SCARD_E_NO_MEMORY;
}
data->len = DataLen;
+ data->freshness = FreshnessCounter;
memcpy(data->data, Data, data->len);
HashTable_Remove(ctx->cache, id);
PCSC_SCARDCONTEXT* ctx = PCSC_GetCardContextData(hContext);
char* id = card_id_and_name_w(CardIdentifier, LookupName);
- WINPR_UNUSED(FreshnessCounter);
-
if (!id)
return SCARD_E_NO_MEMORY;
return SCARD_E_NO_MEMORY;
}
data->len = DataLen;
+ data->freshness = FreshnessCounter;
memcpy(data->data, Data, data->len);
HashTable_Remove(ctx->cache, id);