From: Timo Sirainen Date: Fri, 15 Apr 2016 13:12:44 +0000 (+0300) Subject: lib-storage: Don't use same session ID for multiple mail_storage_service_next() calls. X-Git-Tag: 2.3.0.rc1~3949 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=c977ee6ce06cbc0b4668fde1ec34f2f5e1773684;p=thirdparty%2Fdovecot%2Fcore.git lib-storage: Don't use same session ID for multiple mail_storage_service_next() calls. dsync does multiple mail_storage_service_next() calls for the same mail_storage_service_user. This causes stats plugin to send the same session ID to stats process, which complains about duplicates. Solved this in a generic way by having the following mail_storage_service_next() calls append :counter to session ID. --- diff --git a/src/lib-storage/mail-storage-service.c b/src/lib-storage/mail-storage-service.c index babdab9804..b94d08b513 100644 --- a/src/lib-storage/mail-storage-service.c +++ b/src/lib-storage/mail-storage-service.c @@ -82,6 +82,8 @@ struct mail_storage_service_user { const struct setting_parser_info *user_info; struct setting_parser_context *set_parser; + unsigned int session_id_counter; + unsigned int anonymous:1; unsigned int admin:1; }; @@ -658,8 +660,15 @@ mail_storage_service_init_post(struct mail_storage_service_ctx *ctx, mail_user->admin = user->admin; mail_user->auth_token = p_strdup(mail_user->pool, user->auth_token); mail_user->auth_user = p_strdup(mail_user->pool, user->auth_user); - mail_user->session_id = - p_strdup(mail_user->pool, user->input.session_id); + if (user->session_id_counter++ == 0) { + mail_user->session_id = + p_strdup(mail_user->pool, user->input.session_id); + } else { + mail_user->session_id = + p_strdup_printf(mail_user->pool, "%s:%u", + user->input.session_id, + user->session_id_counter); + } mail_user->userdb_fields = user->input.userdb_fields == NULL ? NULL : p_strarray_dup(mail_user->pool, user->input.userdb_fields); mail_user->autoexpunge_enabled =