From: Timo Sirainen Date: Thu, 20 Apr 2023 08:43:55 +0000 (+0300) Subject: lib-storage: Send mail_user_session_finished via mail_user_unref() X-Git-Tag: 2.4.0~2785 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=41eba2d2d1e7fe8151c08bd7b82977d3deac8576;p=thirdparty%2Fdovecot%2Fcore.git lib-storage: Send mail_user_session_finished via mail_user_unref() The purpose of mail_user_deinit() is to guarantee that the user gets freed at that point - there's no requirement to call it instead of mail_user_unref(). Move the mail_user_session_finished event sending to mail_user_unref() where the rest of the deinitialization code is as well. This also fixes mail_user_session_finished event being wrongly sent in some shared mailbox failure code paths. Potentially it fixes also missing mail_user_session_finished events in some code paths. --- diff --git a/src/lib-storage/mail-user.c b/src/lib-storage/mail-user.c index 4a5b4c23d4..e17f41c86e 100644 --- a/src/lib-storage/mail-user.c +++ b/src/lib-storage/mail-user.c @@ -228,6 +228,30 @@ void mail_user_ref(struct mail_user *user) user->refcount++; } +static void mail_user_session_finished(struct mail_user *user) +{ + struct event *ev = user->event; + struct process_stat *stat = &user->proc_stat; + + process_stat_read_finish(stat, ev); + + struct event_passthrough *e = event_create_passthrough(ev)-> + set_name("mail_user_session_finished")-> + add_int_nonzero("utime", stat->utime)-> + add_int_nonzero("stime", stat->stime)-> + add_int_nonzero("minor_faults", stat->minor_faults)-> + add_int_nonzero("major_faults", stat->major_faults)-> + add_int_nonzero("vol_cs", stat->vol_cs)-> + add_int_nonzero("invol_cs", stat->invol_cs)-> + add_int_nonzero("rss", stat->rss)-> + add_int_nonzero("vsz", stat->vsz)-> + add_int_nonzero("rchar", stat->rchar)-> + add_int_nonzero("wchar", stat->wchar)-> + add_int_nonzero("syscr", stat->syscr)-> + add_int_nonzero("syscw", stat->syscw); + e_debug(e->event(), "User session is finished"); +} + void mail_user_unref(struct mail_user **_user) { struct mail_user *user = *_user; @@ -241,6 +265,8 @@ void mail_user_unref(struct mail_user **_user) } user->deinitializing = TRUE; + if (user->creator == NULL) + mail_user_session_finished(user); /* call deinit() and deinit_pre() with refcount=1, otherwise we may assert-crash in mail_user_ref() that is called by some handlers. */ @@ -255,33 +281,8 @@ void mail_user_unref(struct mail_user **_user) pool_unref(&user->pool); } -static void mail_user_session_finished(struct mail_user *user) -{ - struct event *ev = user->event; - struct process_stat *stat = &user->proc_stat; - - process_stat_read_finish(stat, ev); - - struct event_passthrough *e = event_create_passthrough(ev)-> - set_name("mail_user_session_finished")-> - add_int_nonzero("utime", stat->utime)-> - add_int_nonzero("stime", stat->stime)-> - add_int_nonzero("minor_faults", stat->minor_faults)-> - add_int_nonzero("major_faults", stat->major_faults)-> - add_int_nonzero("vol_cs", stat->vol_cs)-> - add_int_nonzero("invol_cs", stat->invol_cs)-> - add_int_nonzero("rss", stat->rss)-> - add_int_nonzero("vsz", stat->vsz)-> - add_int_nonzero("rchar", stat->rchar)-> - add_int_nonzero("wchar", stat->wchar)-> - add_int_nonzero("syscr", stat->syscr)-> - add_int_nonzero("syscw", stat->syscw); - e_debug(e->event(), "User session is finished"); -} - void mail_user_deinit(struct mail_user **user) { - mail_user_session_finished(*user); i_assert((*user)->refcount == 1); mail_user_unref(user); }