diff options
author | Jakub Jelen <[email protected]> | 2021-04-12 17:19:59 +0000 |
---|---|---|
committer | Werner Koch <[email protected]> | 2021-05-20 12:28:49 +0000 |
commit | 33a2362e566c0e0d7011abf2e5fa5704d7cb4206 (patch) | |
tree | e936d381da279f1cf2fc577b2eb256883999d73a /agent/protect.c | |
parent | sm: Avoid memory leaks and double double-free (diff) | |
download | gnupg-33a2362e566c0e0d7011abf2e5fa5704d7cb4206.tar.gz gnupg-33a2362e566c0e0d7011abf2e5fa5704d7cb4206.zip |
agent: Fix memory leaks
* agent/call-daemon.c (daemon_start): free wctp
* agent/call-scd.c (agent_card_pksign): return error instead of noop
(card_keyinfo_cb): free keyinfo. Restructure to avoid a goto backwards.
* agent/protect.c (agent_get_shadow_info_type): allocate only as a last
action. Catch xtrymalloc failure.
(agent_is_tpm2_key): Free buf.
--
Signed-off-by: Jakub Jelen <[email protected]>
Additional changes are:
- Restructure to avoid a goto backwards.
- Catch xtrymalloc failure.
GnuPG-bug-id: 5393
Signed-off-by: Werner Koch <[email protected]>
Diffstat (limited to 'agent/protect.c')
-rw-r--r-- | agent/protect.c | 20 |
1 files changed, 12 insertions, 8 deletions
diff --git a/agent/protect.c b/agent/protect.c index 76ead444b..2c63a85fe 100644 --- a/agent/protect.c +++ b/agent/protect.c @@ -1660,13 +1660,6 @@ agent_get_shadow_info_type (const unsigned char *shadowkey, n = snext (&s); if (!n) return gpg_error (GPG_ERR_INV_SEXP); - if (shadow_type) { - char *buf = xtrymalloc(n+1); - memcpy(buf, s, n); - buf[n] = '\0'; - *shadow_type = buf; - } - if (smatch (&s, n, "t1-v1") || smatch(&s, n, "tpm2-v1")) { if (*s != '(') @@ -1676,6 +1669,17 @@ agent_get_shadow_info_type (const unsigned char *shadowkey, } else return gpg_error (GPG_ERR_UNSUPPORTED_PROTOCOL); + + if (shadow_type) + { + char *buf = xtrymalloc(n+1); + if (!buf) + return gpg_error_from_syserror (); + memcpy (buf, s, n); + buf[n] = '\0'; + *shadow_type = buf; + } + return 0; } @@ -1701,9 +1705,9 @@ agent_is_tpm2_key (gcry_sexp_t s_skey) return 0; err = agent_get_shadow_info_type (buf, NULL, &type); + xfree (buf); if (err) return 0; - xfree (buf); err = strcmp (type, "tpm2-v1") == 0; xfree (type); |