From fcf9b9e706426cbabc88af5e50774d21cdca81cd Mon Sep 17 00:00:00 2001 From: Frank Morgner Date: Thu, 26 May 2016 13:42:05 +0200 Subject: [PATCH 1/2] fixed missing initialisation and bad memory access --- src/libopensc/reader-pcsc.c | 1 + 1 file changed, 1 insertion(+) diff --git a/src/libopensc/reader-pcsc.c b/src/libopensc/reader-pcsc.c index 23b4dc35..6705d86c 100644 --- a/src/libopensc/reader-pcsc.c +++ b/src/libopensc/reader-pcsc.c @@ -1080,6 +1080,7 @@ static void detect_reader_features(sc_reader_t *reader, SCARDHANDLE card_handle) } if(gpriv->SCardGetAttrib != NULL) { + rcount = sizeof(rbuf); if (gpriv->SCardGetAttrib(card_handle, SCARD_ATTR_VENDOR_NAME, rbuf, &rcount) == SCARD_S_SUCCESS && rcount > 0) { From 46efb02fecacfede1515a2dc9bc7d2c1fbc2ba72 Mon Sep 17 00:00:00 2001 From: Frank Morgner Date: Thu, 26 May 2016 14:36:55 +0200 Subject: [PATCH 2/2] fixed memory leak of reader's vendor name --- src/libopensc/ctx.c | 2 ++ src/libopensc/reader-pcsc.c | 10 ++++++---- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/src/libopensc/ctx.c b/src/libopensc/ctx.c index 8b2acf8a..508e275b 100644 --- a/src/libopensc/ctx.c +++ b/src/libopensc/ctx.c @@ -54,6 +54,8 @@ int _sc_delete_reader(sc_context_t *ctx, sc_reader_t *reader) reader->ops->release(reader); if (reader->name) free(reader->name); + if (reader->vendor) + free(reader->vendor); list_delete(&ctx->readers, reader); free(reader); return SC_SUCCESS; diff --git a/src/libopensc/reader-pcsc.c b/src/libopensc/reader-pcsc.c index 6705d86c..94af43e6 100644 --- a/src/libopensc/reader-pcsc.c +++ b/src/libopensc/reader-pcsc.c @@ -1279,6 +1279,8 @@ static int pcsc_detect_readers(sc_context_t *ctx) if (reader != NULL) { if (reader->name) free(reader->name); + if (reader->vendor) + free(reader->vendor); free(reader); } goto out; @@ -2497,14 +2499,14 @@ int cardmod_use_reader(sc_context_t *ctx, void * pcsc_context_handle, void * pcs goto out; err1: - if (priv != NULL) - { + if (priv != NULL) { free(priv); } - if (reader != NULL) - { + if (reader != NULL) { if (reader->name) free(reader->name); + if (reader->vendor) + free(reader->vendor); free(reader); } }