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>
This commit is contained in:
Daniel Kahn Gillmor 2020-03-19 01:41:45 -04:00 committed by David Bremner
parent 7de3d77d2d
commit 4dccb99282

View file

@ -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 */ /* Verify a signed mime node */
static void static void
node_verify (mime_node_t *node, GMimeObject *part) 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, node->ctx->crypto->decrypt,
message, message,
encrypteddata, &decrypt_result, &err); encrypteddata, &decrypt_result, &err);
if (node->unwrapped_child)
set_unwrapped_child_destructor (node);
} }
if (! node->unwrapped_child) { if (! node->unwrapped_child) {
fprintf (stderr, "Failed to decrypt part: %s\n", fprintf (stderr, "Failed to decrypt part: %s\n",