const void *auth_reply, size_t reply_size)
{
struct auth_request_handler *handler = request->handler;
+
+ request->handler_pending_reply = FALSE;
handler->reply_callback(request, result, auth_reply, reply_size);
}
reply, reply_size);
}
+void auth_request_handler_abort(struct auth_request *request)
+{
+ i_assert(request->handler_pending_reply);
+
+ /* request destroyed while waiting for auth_request_penalty_finish()
+ to be called. */
+ auth_request_handler_unref(&request->handler);
+}
+
static void
auth_request_handler_auth_fail_code(struct auth_request_handler *handler,
struct auth_request *request,
/* handler is referenced until auth_request_handler_reply()
is called. */
handler->refcount++;
+ request->handler_pending_reply = TRUE;
/* before we start authenticating, see if we need to wait first */
auth_penalty_lookup(auth_penalty, request, auth_penalty_callback);
const void *reply, size_t reply_size);
void auth_request_handler_reply_continue(struct auth_request *request,
const void *reply, size_t reply_size);
+void auth_request_handler_abort(struct auth_request *request);
+
unsigned int
auth_request_handler_get_request_count(struct auth_request_handler *handler);
bool auth_request_handler_master_request(struct auth_request_handler *handler,
i_assert(array_count(&request->authdb_event) == 0);
+ if (request->handler_pending_reply)
+ auth_request_handler_abort(request);
+
event_unref(&request->mech_event);
event_unref(&request->event);
auth_request_stats_send(request);
bool userdbs_seen_internal_failure:1;
/* current state: */
+ bool handler_pending_reply:1;
bool accept_cont_input:1;
bool prefer_plain_credentials:1;
bool in_delayed_failure_queue:1;