From: Timo Sirainen Date: Mon, 7 Jun 2010 18:51:59 +0000 (+0100) Subject: auth: More async auth request deinit fixing. X-Git-Tag: 2.0.beta6~36 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=f19cf95ae8fc233567b1c7751595eb66876d684a;p=thirdparty%2Fdovecot%2Fcore.git auth: More async auth request deinit fixing. --HG-- branch : HEAD --- diff --git a/src/auth/auth-request-handler.c b/src/auth/auth-request-handler.c index 097ef69ef2..1298b34384 100644 --- a/src/auth/auth-request-handler.c +++ b/src/auth/auth-request-handler.c @@ -62,12 +62,24 @@ auth_request_handler_create(auth_request_callback_t *callback, void *context, static void auth_request_handler_unref(struct auth_request_handler **_handler) { struct auth_request_handler *handler = *_handler; + struct hash_iterate_context *iter; + void *key, *value; *_handler = NULL; i_assert(handler->refcount > 0); if (--handler->refcount > 0) return; + iter = hash_table_iterate_init(handler->requests); + while (hash_table_iterate(iter, &key, &value)) { + struct auth_request *auth_request = value; + + auth_request->destroyed = TRUE; + auth_request_unref(&auth_request); + } + hash_table_iterate_deinit(&iter); + hash_table_clear(handler->requests, TRUE); + /* notify parent that we're done with all requests */ handler->callback(NULL, handler->context); @@ -86,10 +98,8 @@ auth_request_handler_destroy_requests(struct auth_request_handler *handler) struct auth_request *auth_request = value; auth_request->destroyed = TRUE; - auth_request_unref(&auth_request); } hash_table_iterate_deinit(&iter); - hash_table_clear(handler->requests, TRUE); } void auth_request_handler_destroy(struct auth_request_handler **_handler)