Hi Lucian, Lucian Cojocar wrote,
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
Applied and pushed, Thanks you, Waldemar