]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
Maildir: If dovecot-uidlist has wrong cached virtual size, remove it when we
authorTimo Sirainen <tss@iki.fi>
Sat, 24 May 2008 22:45:31 +0000 (01:45 +0300)
committerTimo Sirainen <tss@iki.fi>
Sat, 24 May 2008 22:45:31 +0000 (01:45 +0300)
detect it. If maildir filename has wrong W value, log a clear error about it.

--HG--
branch : HEAD

src/lib-storage/index/maildir/maildir-mail.c
src/lib-storage/index/maildir/maildir-uidlist.c
src/lib-storage/index/maildir/maildir-uidlist.h

index 55a7277b335447a78ef1accc0f7bd57e89eceac3..288b3ce3dc2dc7de06fc13169ced7b7e143d49a8 100644 (file)
@@ -462,6 +462,34 @@ static int maildir_mail_get_stream(struct mail *_mail,
        return index_mail_init_stream(mail, hdr_size, body_size, stream_r);
 }
 
+static void maildir_mail_set_cache_corrupted(struct mail *_mail,
+                                            enum mail_fetch_field field)
+{
+       struct index_mail *mail = (struct index_mail *)_mail;
+       struct maildir_mailbox *mbox = (struct maildir_mailbox *)mail->ibox;
+       enum maildir_uidlist_rec_flag flags;
+       const char *fname;
+       uoff_t size;
+
+       if (field == MAIL_FETCH_VIRTUAL_SIZE) {
+               /* make sure it gets removed from uidlist.
+                  if it's in file name, we can't really do more than log it. */
+               fname = maildir_uidlist_lookup(mbox->uidlist,
+                                              _mail->uid, &flags);
+               if (maildir_filename_get_size(fname, MAILDIR_EXTRA_VIRTUAL_SIZE,
+                                             &size)) {
+                       i_error("Maildir filename has wrong W value: %s/%s",
+                               mbox->path, fname);
+               } else if (maildir_uidlist_lookup_ext(mbox->uidlist, _mail->uid,
+                               MAILDIR_UIDLIST_REC_EXT_VSIZE) != NULL) {
+                       maildir_uidlist_set_ext(mbox->uidlist, _mail->uid,
+                                               MAILDIR_UIDLIST_REC_EXT_VSIZE,
+                                               NULL);
+               }
+       }
+       index_mail_set_cache_corrupted(_mail, field);
+}
+
 struct mail_vfuncs maildir_mail_vfuncs = {
        index_mail_close,
        index_mail_free,
@@ -485,6 +513,6 @@ struct mail_vfuncs maildir_mail_vfuncs = {
        index_mail_update_flags,
        index_mail_update_keywords,
        index_mail_expunge,
-       index_mail_set_cache_corrupted,
+       maildir_mail_set_cache_corrupted,
        index_mail_get_index_mail
 };
index c46095e7bab8c5a93200d077ad3e1ac3bebe9acd..1e31e7ae3d626a3aac3b8bf61631085c0a8c9261 100644 (file)
@@ -935,8 +935,10 @@ maildir_uidlist_set_ext_real(struct maildir_uidlist *uidlist, uint32_t uid,
                        p += len;
                }
        }
-       buffer_append_c(buf, key);
-       buffer_append(buf, value, strlen(value) + 1);
+       if (value != NULL) {
+               buffer_append_c(buf, key);
+               buffer_append(buf, value, strlen(value) + 1);
+       }
        buffer_append_c(buf, '\0');
 
        rec->extensions = p_malloc(uidlist->record_pool, buf->used);
index 95d6231472ff779efbd1358d40aca85f4ad56571..f9c96ec4753e92a045517aea14c271cfd44bd004 100644 (file)
@@ -80,6 +80,7 @@ void maildir_uidlist_set_uid_validity(struct maildir_uidlist *uidlist,
 void maildir_uidlist_set_next_uid(struct maildir_uidlist *uidlist,
                                  uint32_t next_uid, bool force);
 
+/* Update extended record. value=NULL removes the key. */
 void maildir_uidlist_set_ext(struct maildir_uidlist *uidlist, uint32_t uid,
                             enum maildir_uidlist_rec_ext_key key,
                             const char *value);