return rstream->eof;
}
+
+bool istream_raw_mbox_is_corrupted(struct istream *stream)
+{
+ struct raw_mbox_istream *rstream =
+ (struct raw_mbox_istream *)stream->real_stream;
+
+ return rstream->corrupted;
+}
/* Returns TRUE if we've read the whole mbox. */
bool istream_raw_mbox_is_eof(struct istream *stream);
+/* Returns TRUE if we've noticed corruption in used offsets/sizes. */
+bool istream_raw_mbox_is_corrupted(struct istream *stream);
#endif
if (mail->mail.mail.expunged || mbox->syncing)
return -1;
+ if (mbox->mbox_stream != NULL &&
+ istream_raw_mbox_is_corrupted(mbox->mbox_stream)) {
+ /* clear the corruption by forcing a full resync */
+ sync_flags |= MBOX_SYNC_UNDIRTY | MBOX_SYNC_FORCE_SYNC;
+ }
+
for (try = 0; try < 2; try++) {
if (mbox->mbox_lock_type == F_UNLCK) {
sync_flags |= MBOX_SYNC_LOCK_READING;
} else if ((sync_flags & MBOX_SYNC_FORCE_SYNC) != 0) {
/* dirty offsets are broken and mbox is write-locked.
sync it to update offsets. */
+ mbox_prepare_resync(mail);
if (mbox_sync(mbox, sync_flags) < 0)
return -1;
}
}
/* we'll need to re-sync it completely */
- mbox_prepare_resync(mail);
sync_flags |= MBOX_SYNC_UNDIRTY | MBOX_SYNC_FORCE_SYNC;
}
if (ret == 0) {
#include "mbox-lock.h"
#include "mbox-file.h"
#include "mbox-sync-private.h"
+#include "istream-raw-mbox.h"
#include "mail-copy.h"
#include "index-mail.h"
{
struct mbox_mailbox *mbox = (struct mbox_mailbox *)box;
const struct mail_index_header *hdr;
+ enum mbox_sync_flags sync_flags = 0;
int ret = 0;
+ if (mbox->mbox_stream != NULL &&
+ istream_raw_mbox_is_corrupted(mbox->mbox_stream)) {
+ /* clear the corruption by forcing a full resync */
+ sync_flags |= MBOX_SYNC_UNDIRTY | MBOX_SYNC_FORCE_SYNC;
+ }
+
if (mbox->ibox.view != NULL) {
hdr = mail_index_get_header(mbox->ibox.view);
if ((hdr->flags & MAIL_INDEX_HDR_FLAG_HAVE_DIRTY) != 0 &&
!mbox->mbox_readonly) {
/* we've done changes to mbox which haven't been
written yet. do it now. */
- if (mbox_sync(mbox, MBOX_SYNC_REWRITE) < 0)
- ret = -1;
+ sync_flags |= MBOX_SYNC_REWRITE;
}
}
+ if (sync_flags != 0) {
+ if (mbox_sync(mbox, sync_flags) < 0)
+ ret = -1;
+ }
if (mbox->mbox_global_lock_id != 0)
(void)mbox_unlock(mbox, mbox->mbox_global_lock_id);