diff --git a/src/libopensc/card-mcrd.c b/src/libopensc/card-mcrd.c index 7784f15b..db67f37a 100644 --- a/src/libopensc/card-mcrd.c +++ b/src/libopensc/card-mcrd.c @@ -367,8 +367,11 @@ static int mcrd_init(sc_card_t * card) sc_format_path ("3f00", &tmppath); r = sc_select_file (card, &tmppath, NULL); - if (r < 0) + if (r < 0) { + free(card->drv_data); + card->drv_data = NULL; r = SC_ERROR_INVALID_CARD; + } /* Not needed for the fixed EstEID profile */ if (!is_esteid_card(card)) diff --git a/src/libopensc/card-piv.c b/src/libopensc/card-piv.c index 3298a688..0e56d455 100644 --- a/src/libopensc/card-piv.c +++ b/src/libopensc/card-piv.c @@ -1091,12 +1091,15 @@ piv_get_cached_data(sc_card_t * card, int enumtag, u8 **buf, size_t *buf_len) priv->obj_cache[enumtag].internal_obj_data, priv->obj_cache[enumtag].internal_obj_len); - } else if (r == 0 || r == SC_ERROR_FILE_NOT_FOUND) { - r = SC_ERROR_FILE_NOT_FOUND; - priv->obj_cache[enumtag].flags |= PIV_OBJ_CACHE_VALID; - priv->obj_cache[enumtag].obj_len = 0; - } else if ( r < 0) { - goto err; + } else { + free(rbuf); + if (r == 0 || r == SC_ERROR_FILE_NOT_FOUND) { + r = SC_ERROR_FILE_NOT_FOUND; + priv->obj_cache[enumtag].flags |= PIV_OBJ_CACHE_VALID; + priv->obj_cache[enumtag].obj_len = 0; + } else if ( r < 0) { + goto err; + } } ok: