diff options
author | Daniel Kahn Gillmor <dkg@fifthhorseman.net> | 2020-03-19 01:41:45 -0400 |
---|---|---|
committer | David Bremner <david@tethera.net> | 2020-03-22 22:21:03 -0300 |
commit | 4dccb9928280bd60b79a662dc855187e7522ceba (patch) | |
tree | 26a2f82862bef6cfe6654a2f8a823297dfbb6dac /mime-node.c | |
parent | 7de3d77d2d31abaea78e70f4da9d9f2a5ef84a58 (diff) |
mime-node: Clean up unwrapped MIME parts correctly.
Avoid a memory leak in the notmuch command line.
gmime_multipart_encrypted_decrypt returns a GMimeObject marked by
GMime as "transfer full", so we are supposed to clean up after it.
When parsing a message, notmuch would leak one GMimeObject part per
multipart/encrypted MIME layer. We clean it up by analogy with
cleaning up the signature list associated with a MIME node.
Signed-off-by: Daniel Kahn Gillmor <dkg@fifthhorseman.net>
Diffstat (limited to 'mime-node.c')
-rw-r--r-- | mime-node.c | 22 |
1 files changed, 22 insertions, 0 deletions
diff --git a/mime-node.c b/mime-node.c index 2a823dfd..ff6805bf 100644 --- a/mime-node.c +++ b/mime-node.c @@ -192,6 +192,26 @@ set_signature_list_destructor (mime_node_t *node) } } +/* Unwrapped MIME part destructor */ +static int +_unwrapped_child_free (GMimeObject **proxy) +{ + g_object_unref (*proxy); + return 0; +} + +/* Set up unwrapped MIME part destructor */ +static void +set_unwrapped_child_destructor (mime_node_t *node) +{ + GMimeObject **proxy = talloc (node, GMimeObject *); + + if (proxy) { + *proxy = node->unwrapped_child; + talloc_set_destructor (proxy, _unwrapped_child_free); + } +} + /* Verify a signed mime node */ static void node_verify (mime_node_t *node, GMimeObject *part) @@ -238,6 +258,8 @@ node_decrypt_and_verify (mime_node_t *node, GMimeObject *part) node->ctx->crypto->decrypt, message, encrypteddata, &decrypt_result, &err); + if (node->unwrapped_child) + set_unwrapped_child_destructor (node); } if (! node->unwrapped_child) { fprintf (stderr, "Failed to decrypt part: %s\n", |