summaryrefslogtreecommitdiffstats
path: root/lib/config.cc
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 /lib/config.cc
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.
Diffstat (limited to 'lib/config.cc')
-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",