Skip to contentSkip to conversation

Fix memory leaks in libimaevm

PATCH New Stefan Berger 1 participant 3 messages Mar 24 Keys-trusted

lore
Share & tools
lore
#0 lore raw

cover Fix memory leaks in libimaevm

This series fixes two memory leaks in libimaevm.

Stefan

Stefan Berger (2):
Use EVP_PKEY_free to free a key of public_key_entry Avoid memory leak if public_keys is NULL

 src/libimaevm.c | 21 ++++++++++-----------
 1 file changed, 10 insertions(+), 11 deletions(-)
Signature · 1 line
2.53.0
#1 lore raw

PATCH 1/2 Use EVP_PKEY_free to free a key of public_key_entry

Use EVP_PKEY_free to fix a memory leak that occurs when using free() on the key field of public_key_entry that is a pointer to an EVP_PKEY.

---
 src/libimaevm.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)
src/libimaevm.c +1 -1
index 3b268d5..6512ee5 100644
@@ -400,7 +400,7 @@ void imaevm_free_public_keys(struct public_key_entry *public_keys)
 	while (entry) {
 		next = entry->next;
 		if (entry->key)
-			free(entry->key);
+			EVP_PKEY_free(entry->key);
 		free(entry);
 		entry = next;
 	}
Signature · 1 line
2.53.0
#2 lore raw

PATCH 2/2 Avoid memory leak if public_keys is NULL

In reply to Stefan Berger

Avoid a memory leak of a public_key_entry if the passed public_keys pointer is NULL because in this case the entry is lost. For this particular case to work we would need public keys to be passed in as 'struct public_key_entry **public_keys' so that '*public_keys = entry' could be assign. However, this change would propagate all the way to the API of the library and we don't want to change existing functions' signature.

This change should not have any noticeable side-effect since the resolved case did not work before but the newly allocated entry was lost.

---
 src/libimaevm.c | 19 +++++++++----------
 1 file changed, 9 insertions(+), 10 deletions(-)
src/libimaevm.c +9 -10
index 6512ee5..d8d5dbc 100644
@@ -378,17 +378,16 @@ static EVP_PKEY *find_keyid(struct public_key_entry *public_keys,
 		tail = entry;
 	}
 
-	/* add unknown keys to list */
-	entry = calloc(1, sizeof(struct public_key_entry));
-	if (!entry) {
-		perror("calloc");
-		return 0;
-	}
-	entry->keyid = keyid;
-	if (tail)
+	/* add unknown keys to tail of list */
+	if (tail) {
+		entry = calloc(1, sizeof(struct public_key_entry));
+		if (!entry) {
+			perror("calloc");
+			return 0;
+		}
+		entry->keyid = keyid;
 		tail->next = entry;
-	else
-		public_keys = entry;
+	}
 	log_err("key %d: %x (unknown keyid)\n", i, __be32_to_cpup(&keyid));
 	return 0;
 }
Signature · 1 line
2.53.0