mirror of
https://git.notmuchmail.org/git/notmuch
synced 2024-11-25 12:28:09 +01:00
lib: Clean up error handling in _notmuch_thread_create
Previously, there were various opportunities for memory leaks in the error-handling paths of this function. Use a local talloc context and some reparenting to make eliminate these leaks, while keeping the control flow simple.
This commit is contained in:
parent
0d8d11d338
commit
086dab4333
1 changed files with 19 additions and 14 deletions
|
@ -406,7 +406,8 @@ _notmuch_thread_create (void *ctx,
|
||||||
notmuch_string_list_t *exclude_terms,
|
notmuch_string_list_t *exclude_terms,
|
||||||
notmuch_sort_t sort)
|
notmuch_sort_t sort)
|
||||||
{
|
{
|
||||||
notmuch_thread_t *thread;
|
void *local = talloc_new (ctx);
|
||||||
|
notmuch_thread_t *thread = NULL;
|
||||||
notmuch_message_t *seed_message;
|
notmuch_message_t *seed_message;
|
||||||
const char *thread_id;
|
const char *thread_id;
|
||||||
char *thread_id_query_string;
|
char *thread_id_query_string;
|
||||||
|
@ -415,24 +416,23 @@ _notmuch_thread_create (void *ctx,
|
||||||
notmuch_messages_t *messages;
|
notmuch_messages_t *messages;
|
||||||
notmuch_message_t *message;
|
notmuch_message_t *message;
|
||||||
|
|
||||||
seed_message = _notmuch_message_create (ctx, notmuch, seed_doc_id, NULL);
|
seed_message = _notmuch_message_create (local, notmuch, seed_doc_id, NULL);
|
||||||
if (! seed_message)
|
if (! seed_message)
|
||||||
INTERNAL_ERROR ("Thread seed message %u does not exist", seed_doc_id);
|
INTERNAL_ERROR ("Thread seed message %u does not exist", seed_doc_id);
|
||||||
|
|
||||||
thread_id = notmuch_message_get_thread_id (seed_message);
|
thread_id = notmuch_message_get_thread_id (seed_message);
|
||||||
thread_id_query_string = talloc_asprintf (ctx, "thread:%s", thread_id);
|
thread_id_query_string = talloc_asprintf (local, "thread:%s", thread_id);
|
||||||
if (unlikely (thread_id_query_string == NULL))
|
if (unlikely (thread_id_query_string == NULL))
|
||||||
return NULL;
|
goto DONE;
|
||||||
|
|
||||||
thread_id_query = notmuch_query_create (notmuch, thread_id_query_string);
|
thread_id_query = talloc_steal (
|
||||||
|
local, notmuch_query_create (notmuch, thread_id_query_string));
|
||||||
if (unlikely (thread_id_query == NULL))
|
if (unlikely (thread_id_query == NULL))
|
||||||
return NULL;
|
goto DONE;
|
||||||
|
|
||||||
talloc_free (thread_id_query_string);
|
thread = talloc (local, notmuch_thread_t);
|
||||||
|
|
||||||
thread = talloc (ctx, notmuch_thread_t);
|
|
||||||
if (unlikely (thread == NULL))
|
if (unlikely (thread == NULL))
|
||||||
return NULL;
|
goto DONE;
|
||||||
|
|
||||||
talloc_set_destructor (thread, _notmuch_thread_destructor);
|
talloc_set_destructor (thread, _notmuch_thread_destructor);
|
||||||
|
|
||||||
|
@ -451,8 +451,10 @@ _notmuch_thread_create (void *ctx,
|
||||||
free, NULL);
|
free, NULL);
|
||||||
|
|
||||||
thread->message_list = _notmuch_message_list_create (thread);
|
thread->message_list = _notmuch_message_list_create (thread);
|
||||||
if (unlikely (thread->message_list == NULL))
|
if (unlikely (thread->message_list == NULL)) {
|
||||||
return NULL;
|
thread = NULL;
|
||||||
|
goto DONE;
|
||||||
|
}
|
||||||
|
|
||||||
thread->message_hash = g_hash_table_new_full (g_str_hash, g_str_equal,
|
thread->message_hash = g_hash_table_new_full (g_str_hash, g_str_equal,
|
||||||
free, NULL);
|
free, NULL);
|
||||||
|
@ -489,12 +491,15 @@ _notmuch_thread_create (void *ctx,
|
||||||
_notmuch_message_close (message);
|
_notmuch_message_close (message);
|
||||||
}
|
}
|
||||||
|
|
||||||
notmuch_query_destroy (thread_id_query);
|
|
||||||
|
|
||||||
_resolve_thread_authors_string (thread);
|
_resolve_thread_authors_string (thread);
|
||||||
|
|
||||||
_resolve_thread_relationships (thread);
|
_resolve_thread_relationships (thread);
|
||||||
|
|
||||||
|
/* Commit to returning thread. */
|
||||||
|
talloc_steal (ctx, thread);
|
||||||
|
|
||||||
|
DONE:
|
||||||
|
talloc_free (local);
|
||||||
return thread;
|
return thread;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue