summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDavid Bremner <david@tethera.net>2020-10-29 21:13:01 -0300
committerDavid Bremner <david@tethera.net>2020-10-29 21:13:01 -0300
commit582e919e2769bd99064b997b05e1601ffcfe9a98 (patch)
treee1300cc4e8df65a9a6f6b980b9047e38eb119fde
parentb042a59cdf8be7ad215268eee32d4cc114d312bb (diff)
lib/config: don't set destructor until iterator is initialized.
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.
-rw-r--r--lib/config.cc2
1 files changed, 1 insertions, 1 deletions
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",