[dovecot-cvs] dovecot/src/lib mmap-anon.c,1.11,1.12

cras at procontrol.fi cras at procontrol.fi
Wed Apr 23 19:54:07 EEST 2003


Update of /home/cvs/dovecot/src/lib
In directory danu:/tmp/cvs-serv15853

Modified Files:
	mmap-anon.c 
Log Message:
mremap_anon() was broken when it had to move data.



Index: mmap-anon.c
===================================================================
RCS file: /home/cvs/dovecot/src/lib/mmap-anon.c,v
retrieving revision 1.11
retrieving revision 1.12
diff -u -d -r1.11 -r1.12
--- mmap-anon.c	23 Apr 2003 14:31:40 -0000	1.11
+++ mmap-anon.c	23 Apr 2003 15:54:05 -0000	1.12
@@ -104,6 +104,10 @@
 
 	i_assert(address != NULL);
 
+	i_warning("%p %u", address, length);
+	errno = ENOMEM;
+	return -1;
+
 	base = mmap(address, length, PROT_READ | PROT_WRITE,
 		    MAP_FIXED | MAP_ANONYMOUS | MAP_PRIVATE, zero_fd, 0);
 
@@ -233,7 +237,7 @@
 	char *p;
 	size_t block_size, old_size;
 
-	new_base = mmap_anon(new_size - header_size);
+	new_base = mmap_anon(new_size);
 	if (new_base == MAP_FAILED)
 		return MAP_FAILED;
 
@@ -242,16 +246,20 @@
 	old_size = hdr->size;
 	block_size = 1024*1024;
 
-	p = (char *) (hdr + header_size + hdr->size);
+	p = (char *) hdr + header_size + hdr->size;
 	do {
 		if (block_size > old_size)
 			block_size = old_size;
 		p -= block_size;
+		old_size -= block_size;
 
-		memcpy((char *) new_base + (p - (char *) hdr), p, block_size);
+		memcpy((char *) new_base + old_size, p, block_size);
 		if (munmap((void *) p, block_size) < 0)
 			i_panic("munmap() failed: %m");
-	} while (p != (char *) hdr);
+	} while (old_size != 0);
+
+	if (munmap((void *) hdr, header_size) < 0)
+		i_panic("munmap() failed: %m");
 
 	return new_base;
 }




More information about the dovecot-cvs mailing list