changeset 20897:d589f2e1e20a

lib-storage: Make sure mailbox_uidvalidity_next() doesn't return 0. 0 isn't a valid IMAP UIDVALIDITY, and Dovecot treats 0 as "not assigned".
author Timo Sirainen <timo.sirainen@dovecot.fi>
date Mon, 17 Oct 2016 12:34:36 +0300
parents fbdf07d53d13
children f7e0b7de0540
files src/lib-storage/mailbox-uidvalidity.c
diffstat 1 files changed, 6 insertions(+), 1 deletions(-) [+]
line wrap: on
line diff
--- a/src/lib-storage/mailbox-uidvalidity.c	Mon Oct 17 21:03:51 2016 +0300
+++ b/src/lib-storage/mailbox-uidvalidity.c	Mon Oct 17 12:34:36 2016 +0300
@@ -28,6 +28,8 @@
 		uid_validity = (uint32_t)ioloop_time;
 	else
 		uid_validity++;
+	if (uid_validity == 0)
+		uid_validity = 1;
 	return uid_validity;
 }
 
@@ -88,6 +90,8 @@
 
 		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 @@
 		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);