[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