diff --git a/src/minidriver/minidriver.c b/src/minidriver/minidriver.c index f7318ec0..2d228960 100644 --- a/src/minidriver/minidriver.c +++ b/src/minidriver/minidriver.c @@ -319,7 +319,7 @@ static void print_werror(PCARD_DATA pCardData, PSTR str) static int check_reader_status(PCARD_DATA pCardData) { - int r; + int r = SCARD_S_SUCCESS; VENDOR_SPECIFIC *vs = NULL; logprintf(pCardData, 4, "check_reader_status\n"); @@ -340,6 +340,8 @@ check_reader_status(PCARD_DATA pCardData) r = disassociate_card(pCardData); logprintf(pCardData, 1, "disassociate_card r = 0x%08X\n", r); r = associate_card(pCardData); /* need to check return codes */ + if (r != SCARD_S_SUCCESS) + return r; logprintf(pCardData, 1, "associate_card r = 0x%08X\n", r); /* Rebuild 'soft' fs - in case changed */ r = md_fs_init(pCardData); @@ -351,7 +353,7 @@ check_reader_status(PCARD_DATA pCardData) logprintf(pCardData, 2, "check_reader_status r=%d flags 0x%08X\n", r, vs->reader->flags); } - return SCARD_S_SUCCESS; + return r; } static DWORD @@ -1274,6 +1276,9 @@ md_fs_read_content(PCARD_DATA pCardData, char *parent, struct md_file *file) logprintf(pCardData, 2, "directory '%s' not found\n", parent ? parent : ""); return; } + if (vs->p15card == NULL) { + return SCARD_F_INTERNAL_ERROR; + } if (!strcmp(dir->name, "mscp")) { int idx, rv; @@ -2585,6 +2590,10 @@ DWORD WINAPI CardGetContainerInfo(__in PCARD_DATA pCardData, __in BYTE bContaine return SCARD_E_NO_KEY_CONTAINER; } + if (vs->p15card == NULL) { + return SCARD_F_INTERNAL_ERROR; + } + check_reader_status(pCardData); pubkey_der.value = NULL; pubkey_der.len = 0; @@ -3667,7 +3676,10 @@ DWORD WINAPI CardAuthenticateEx(__in PCARD_DATA pCardData, vs = (VENDOR_SPECIFIC*)(pCardData->pvVendorSpecific); - check_reader_status(pCardData); + r = check_reader_status(pCardData); + + if ((vs->p15card) == NULL) + return SCARD_F_INTERNAL_ERROR; if (dwFlags == CARD_AUTHENTICATE_GENERATE_SESSION_PIN || dwFlags == CARD_AUTHENTICATE_SESSION_PIN) { if (! (vs->reader->capabilities & SC_READER_CAP_PIN_PAD))