mirror of
https://git.notmuchmail.org/git/notmuch
synced 2025-01-03 15:21:41 +01:00
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.
This commit is contained in:
parent
b042a59cdf
commit
582e919e27
1 changed files with 1 additions and 1 deletions
|
@ -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",
|
||||
|
|
Loading…
Reference in a new issue