summaryrefslogtreecommitdiffstats
path: root/mime-node.c
diff options
context:
space:
mode:
authorDaniel Kahn Gillmor <dkg@fifthhorseman.net>2020-03-19 01:41:45 -0400
committerDavid Bremner <david@tethera.net>2020-03-22 22:21:03 -0300
commit4dccb9928280bd60b79a662dc855187e7522ceba (patch)
tree26a2f82862bef6cfe6654a2f8a823297dfbb6dac /mime-node.c
parent7de3d77d2d31abaea78e70f4da9d9f2a5ef84a58 (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.c22
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",