Waldemar Brodkorb <wbx <at> ucibc-ng.org>
writes:
Hi Lucian,
Lucian Cojocar wrote,
Hi,
Any follow-up on this patch?
Not yet. You are saying the second segmentation fault would be
expected. What is then the exact benefit of the patch, if the result
is a segfault?
'memset' will work on a range >= 2GB.
Or do you have a simple testcase showing breakage
before your patch
and non-breakage after?
Yes, I have a test which works in an environment where you can use more than
2GB contiguous virtual memory (e.g. have enough swap to accommodate 2GB
contiguous virtual memory).
"""
#include <string.h>
#include <stdio.h>
#include <sys/mman.h>
#define GB (size_t)(1*(1 << 30ul))
#define TWO_GB (2*(size_t)(GB))
#define S (size_t)(TWO_GB+4096)
int
main(void)
{
char *p = NULL;
p = mmap(NULL, S, PROT_READ|PROT_WRITE, MAP_ANONYMOUS|MAP_PRIVATE,
-1, 0);
if (p == MAP_FAILED) {
perror("mmap");
exit(-1);
}
printf("&p[0] = %p\n", &p[0]);
printf("&p[S] = %p\n", &p[S]);
printf("memsetting ...");
memset(p, 0xaa, S);
printf("done\n");
printf("p[S-1]=%02x\n", (unsigned char)p[S-1]);
exit(0);
}
"""
~# ./main-buggy-memset.elf
&p[0] = 0x36f66000
&p[S] = 0xb6f67000
Segmentation fault
~# ./main-fixed-memset.elf
&p[0] = 0x36f8a000
&p[S] = 0xb6f8b000
memsetting ...done
p[S-1]=aa
~# free -h
total used free shared buffers cached
Mem: 247M 56M 191M 252K 4.3M 33M
-/+ buffers/cache: 19M 228M
Swap: 10G 16M 10G