$OpenBSD: patch-imap_mailbox_c,v 1.6 2012/01/06 15:34:17 ajacoutot Exp $

From d4cbb22ebeeda6e817c7eafa7d7e38997919dca1 Mon Sep 17 00:00:00 2001
From: Bron Gondwana <brong@opera.com>
Date: Fri, 06 Jan 2012 14:50:29 +0000
Subject: mailbox: safe against map_nommap

--- imap/mailbox.c.orig	Fri Dec 30 22:19:18 2011
+++ imap/mailbox.c	Fri Jan  6 16:22:22 2012
@@ -1312,15 +1312,15 @@ static int mailbox_refresh_index_map(struct mailbox *m
 
 	mailbox->index_size = sbuf.st_size;
 
-	/* need to map some more space! */
-	map_refresh(mailbox->index_fd, 1, &mailbox->index_base,
-		    &mailbox->index_len, mailbox->index_size,
-		    "index", mailbox->name);
-
-	/* and the cache will be stale too */
+	/* the cache will be stale too */
 	mailbox->need_cache_refresh = 1;
     }
 
+    /* always refresh, so we're safe for map_nommap */
+    map_refresh(mailbox->index_fd, 1, &mailbox->index_base,
+		&mailbox->index_len, mailbox->index_size,
+		"index", mailbox->name);
+
     return 0;
 }
 
@@ -2150,8 +2150,8 @@ int mailbox_rewrite_index_record(struct mailbox *mailb
 		session_id(), mailbox->name, mailbox->uniqueid,
 		record->uid, message_guid_encode(&record->guid));
     }
-    
-    return 0;
+
+    return mailbox_refresh_index_map(mailbox);
 }
 
 /* append a single message to a mailbox - also updates everything
@@ -2255,13 +2255,6 @@ int mailbox_append_index_record(struct mailbox *mailbo
     mailbox->i.num_records = recno;
     mailbox->index_size += INDEX_RECORD_SIZE;
 
-    /* extend the mmaped space for the index file */
-    if (mailbox->index_len < mailbox->index_size) {
-	map_refresh(mailbox->index_fd, 1, &mailbox->index_base,
-		    &mailbox->index_len, mailbox->index_size,
-		    "index", mailbox->name);
-    }
-
     if (config_auditlog)
 	syslog(LOG_NOTICE, "auditlog: append sessionid=<%s> mailbox=<%s> uniqueid=<%s> uid=<%u> guid=<%s>",
 	    session_id(), mailbox->name, mailbox->uniqueid, record->uid,
@@ -2288,8 +2281,8 @@ int mailbox_append_index_record(struct mailbox *mailbo
 		   session_id(), mailbox->name, mailbox->uniqueid,
 		   record->uid);
     }
-    
-    return 0;
+
+    return mailbox_refresh_index_map(mailbox);
 }
 
 static void mailbox_message_unlink(struct mailbox *mailbox, uint32_t uid)
