diff src/lib/file-cache.c @ 4866:4ec6ceb0934a HEAD

If mremap_anon() fails, don't leak/crash.
author Timo Sirainen <tss@iki.fi>
date Sun, 03 Dec 2006 17:21:29 +0200
parents a69ab82d7346
children e4afafbb963b
line wrap: on
line diff
--- a/src/lib/file-cache.c	Sun Dec 03 17:09:37 2006 +0200
+++ b/src/lib/file-cache.c	Sun Dec 03 17:21:29 2006 +0200
@@ -50,6 +50,7 @@
 {
 	size_t page_size = mmap_get_page_size();
 	uoff_t diff = size % page_size;
+	void *new_base;
 
 	if (diff != 0)
 		size += page_size - diff;
@@ -73,14 +74,14 @@
 			return -1;
 		}
 	} else {
-		cache->mmap_base = mremap_anon(cache->mmap_base,
-					       cache->mmap_length,
-					       size, MREMAP_MAYMOVE);
-		if (cache->mmap_base == MAP_FAILED) {
+		new_base = mremap_anon(cache->mmap_base, cache->mmap_length,
+				       size, MREMAP_MAYMOVE);
+		if (new_base == MAP_FAILED) {
 			i_error("mremap_anon(%"PRIuUOFF_T") failed: %m", size);
-			cache->mmap_length = 0;
 			return -1;
 		}
+
+		cache->mmap_base = new_base;
 	}
 	cache->mmap_length = size;
 	return 0;