aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorNIIBE Yutaka <[email protected]>2021-05-07 01:48:13 +0000
committerNIIBE Yutaka <[email protected]>2021-05-07 01:48:13 +0000
commit5d1b41310682a599a16bcb95e18f56e62299059e (patch)
tree5d797480f0702b979ac0ecbbe83848298a026911
parentscd: Fix declarations for PC/SC access. (diff)
downloadgnupg-5d1b41310682a599a16bcb95e18f56e62299059e.tar.gz
gnupg-5d1b41310682a599a16bcb95e18f56e62299059e.zip
scd: Fix memory leak for RDRNAME and serialize access.
* scd/apdu.c (close_pcsc_reader): Move locking to... (apdu_close_reader): ... here, as it's also needed for CCID driver. Free RDRNAME when closed. -- Signed-off-by: NIIBE Yutaka <[email protected]>
-rw-r--r--scd/apdu.c8
1 files changed, 6 insertions, 2 deletions
diff --git a/scd/apdu.c b/scd/apdu.c
index e601e1a38..d34127a10 100644
--- a/scd/apdu.c
+++ b/scd/apdu.c
@@ -836,13 +836,11 @@ close_pcsc_reader (int slot)
int i;
/*log_debug ("%s: releasing context\n", __func__);*/
- npth_mutex_lock (&reader_table_lock);
if (pcsc.context)
pcsc_release_context (pcsc.context);
pcsc.context = 0;
for (i = 0; i < MAX_READER; i++)
pcsc.rdrname[i] = NULL;
- npth_mutex_unlock (&reader_table_lock);
}
return 0;
}
@@ -2338,15 +2336,21 @@ apdu_close_reader (int slot)
}
if (reader_table[slot].close_reader)
{
+ npth_mutex_lock (&reader_table_lock);
sw = reader_table[slot].close_reader (slot);
+ xfree (reader_table[slot].rdrname);
+ reader_table[slot].rdrname = NULL;
reader_table[slot].used = 0;
+ npth_mutex_unlock (&reader_table_lock);
if (DBG_READER)
log_debug ("leave: apdu_close_reader => 0x%x (close_reader)\n", sw);
return sw;
}
+ npth_mutex_lock (&reader_table_lock);
xfree (reader_table[slot].rdrname);
reader_table[slot].rdrname = NULL;
reader_table[slot].used = 0;
+ npth_mutex_unlock (&reader_table_lock);
if (DBG_READER)
log_debug ("leave: apdu_close_reader => SW_HOST_NOT_SUPPORTED\n");
return SW_HOST_NOT_SUPPORTED;