]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
lib-storage: Make sure mailbox_uidvalidity_next() doesn't return 0.
authorTimo Sirainen <timo.sirainen@dovecot.fi>
Mon, 17 Oct 2016 09:34:36 +0000 (12:34 +0300)
committerTimo Sirainen <timo.sirainen@dovecot.fi>
Wed, 19 Oct 2016 12:43:31 +0000 (15:43 +0300)
0 isn't a valid IMAP UIDVALIDITY, and Dovecot treats 0 as "not assigned".

src/lib-storage/mailbox-uidvalidity.c

index ad5e1e632c1e0f40f12e959688ecec4ea23161ef..d89f7a1a1db1cb8d18f168ccfa0c6ecad448b7e6 100644 (file)
@@ -28,6 +28,8 @@ static uint32_t mailbox_uidvalidity_next_fallback(void)
                uid_validity = (uint32_t)ioloop_time;
        else
                uid_validity++;
+       if (uid_validity == 0)
+               uid_validity = 1;
        return uid_validity;
 }
 
@@ -88,6 +90,8 @@ mailbox_uidvalidity_rename(const char *path, uint32_t *uid_validity,
 
                str_printfa(src, ".%08x", *uid_validity);
                *uid_validity += 1;
+               if (*uid_validity == 0)
+                       *uid_validity += 1;
                str_printfa(dest, ".%08x", *uid_validity);
 
                if ((ret = rename(str_c(src), str_c(dest))) == 0 ||
@@ -209,7 +213,8 @@ uint32_t mailbox_uidvalidity_next(struct mailbox_list *list, const char *path)
                return mailbox_uidvalidity_next_rescan(list, path);
        }
        buf[sizeof(buf)-1] = 0;
-       if (ret == 0 || str_to_uint32_hex(buf, &cur_value) < 0) {
+       if (ret == 0 || str_to_uint32_hex(buf, &cur_value) < 0 ||
+           cur_value == 0) {
                /* broken value */
                i_close_fd(&fd);
                return mailbox_uidvalidity_next_rescan(list, path);