From 582e919e2769bd99064b997b05e1601ffcfe9a98 Mon Sep 17 00:00:00 2001 From: David Bremner Date: Thu, 29 Oct 2020 21:13:01 -0300 Subject: [PATCH] lib/config: don't set destructor until iterator is initialized. MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit As diagnosed by Olivier Taïbi in id:20201027100916.emry3k2wujod4xnl@galois.lan, if an exception is thrown while the initialization is happening (e.g. if the function is called on a closed database), then the destructor is (sometimes) invoked on an uninitialized Xapian object. Solve the problem by moving the setting of the destructor until after the placement new successfully completes. It is conceivable this might cause a memory leak, but that seems preferable to crashing, and in any case, there seems to be nothing better to be done if the initialization is failing things are in an undefined state by definition. --- lib/config.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/config.cc b/lib/config.cc index dae0ff0e..efab01e4 100644 --- a/lib/config.cc +++ b/lib/config.cc @@ -113,7 +113,6 @@ notmuch_database_get_config_list (notmuch_database_t *notmuch, goto DONE; } - talloc_set_destructor (list, _notmuch_config_list_destroy); list->notmuch = notmuch; list->current_key = NULL; list->current_val = NULL; @@ -122,6 +121,7 @@ notmuch_database_get_config_list (notmuch_database_t *notmuch, new(&(list->iterator)) Xapian::TermIterator (notmuch->xapian_db->metadata_keys_begin (CONFIG_PREFIX + (prefix ? prefix : ""))); + talloc_set_destructor (list, _notmuch_config_list_destroy); } catch (const Xapian::Error &error) { _notmuch_database_log (notmuch, "A Xapian exception occurred getting metadata iterator: %s.\n", -- 2.43.0