From: Anton Khirnov Date: Mon, 15 Jun 2020 20:58:49 +0000 (+0200) Subject: python/notmuch2: do not destroy messages owned by a query X-Git-Tag: archive/debian/0.30_rc2-1~6 X-Git-Url: https://git.cworth.org/git?a=commitdiff_plain;h=131757907907380213b32934d9e73cec942ace43;hp=131757907907380213b32934d9e73cec942ace43;p=notmuch python/notmuch2: do not destroy messages owned by a query Any messages retrieved from a query - either directly via search_messages() or indirectly via thread objects - are owned by that query. Retrieving the same message (i.e. corresponding to the same message ID / database object) several times will always yield the same C object. The caller is allowed to destroy message objects owned by a query before the query itself - which can save memory for long-lived queries. However, that message must then never be retrieved again from that query. The python-notmuch2 bindings will currently destroy every message object in Message._destroy(), which will lead to an invalid free if the same message is then retrieved again. E.g. the following python program leads to libtalloc abort()ing: import notmuch2 db = notmuch2.Database(mode = notmuch2.Database.MODE.READ_ONLY) t = next(db.threads('*')) msgs = list(zip(t.toplevel(), t.toplevel())) msgs = list(zip(t.toplevel(), t.toplevel())) Fix this issue by creating a subclass of Message, which is used for "standalone" message which have to be freed by the caller. Message class is then used only for messages descended from a query, which do not need to be freed by the caller. ---