From 75847f4e93c249eea75cd3f73de8148ce38e27b1 Mon Sep 17 00:00:00 2001 From: Jakub Jelen Date: Wed, 13 Nov 2019 15:01:31 +0100 Subject: [PATCH] Make ef_dir variable local Thanks oss-fuzz https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=18821 --- src/libopensc/card.c | 2 -- src/libopensc/dir.c | 15 +++++++-------- src/libopensc/opensc.h | 1 - 3 files changed, 7 insertions(+), 11 deletions(-) diff --git a/src/libopensc/card.c b/src/libopensc/card.c index 3fe274d8..7a1c4d42 100644 --- a/src/libopensc/card.c +++ b/src/libopensc/card.c @@ -157,8 +157,6 @@ static void sc_card_free(sc_card_t *card) sc_free_apps(card); sc_free_ef_atr(card); - sc_file_free(card->ef_dir); - free(card->ops); if (card->algorithms != NULL) { diff --git a/src/libopensc/dir.c b/src/libopensc/dir.c index bd60e522..9d9abf9a 100644 --- a/src/libopensc/dir.c +++ b/src/libopensc/dir.c @@ -160,6 +160,7 @@ int sc_enum_apps(sc_card_t *card) int ef_structure; size_t file_size, jj; int r, ii, idx; + struct sc_file *ef_dir = NULL; LOG_FUNC_CALLED(ctx); @@ -167,23 +168,21 @@ int sc_enum_apps(sc_card_t *card) card->app_count = 0; sc_format_path("3F002F00", &path); - sc_file_free(card->ef_dir); - card->ef_dir = NULL; - r = sc_select_file(card, &path, &card->ef_dir); + r = sc_select_file(card, &path, &ef_dir); LOG_TEST_RET(ctx, r, "Cannot select EF.DIR file"); - if (card->ef_dir->type != SC_FILE_TYPE_WORKING_EF) { - sc_file_free(card->ef_dir); - card->ef_dir = NULL; + if (ef_dir->type != SC_FILE_TYPE_WORKING_EF) { + sc_file_free(ef_dir); LOG_TEST_RET(ctx, SC_ERROR_INVALID_CARD, "EF(DIR) is not a working EF."); } - ef_structure = card->ef_dir->ef_structure; + ef_structure = ef_dir->ef_structure; + file_size = ef_dir->size; + sc_file_free(ef_dir); if (ef_structure == SC_FILE_EF_TRANSPARENT) { u8 *buf = NULL, *p; size_t bufsize; - file_size = card->ef_dir->size; if (file_size == 0) LOG_FUNC_RETURN(ctx, 0); if (file_size > MAX_FILE_SIZE) diff --git a/src/libopensc/opensc.h b/src/libopensc/opensc.h index 15977d78..3ef3ee59 100644 --- a/src/libopensc/opensc.h +++ b/src/libopensc/opensc.h @@ -580,7 +580,6 @@ typedef struct sc_card { struct sc_app_info *app[SC_MAX_CARD_APPS]; int app_count; - struct sc_file *ef_dir; struct sc_ef_atr *ef_atr;