]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
lib-storage: Send mail_user_session_finished via mail_user_unref()
authorTimo Sirainen <timo.sirainen@open-xchange.com>
Thu, 20 Apr 2023 08:43:55 +0000 (11:43 +0300)
committeraki.tuomi <aki.tuomi@open-xchange.com>
Mon, 24 Apr 2023 10:42:06 +0000 (10:42 +0000)
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.

src/lib-storage/mail-user.c

index 4a5b4c23d4d1cee952ba820ddde51df7293e2f0c..e17f41c86ee2744f22bbae57f56e5598740a504e 100644 (file)
@@ -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);
 }