On Sat, Jul 11, 2020 at 09:12:55PM -0600, Theo de Raadt wrote:
> Peter J. Philipp <[email protected]> wrote:
>
> > Is this possible at all? I have mmap'ed (shared) a process and it has
> > childs.
> > I would like to unmap this mmap in one child only but I'm not sure if the
> > other childs that should have this mapping still will lose it or not? Can
> > someone enlighten me on this?
>
> Write a test program.
>
> The behaviour you see will soon, based upon the MAP_ options you use,
> will soon be precisely what is documented, and you'll understand how
> it works.
Thanks for the hint. I wrote a test program and I'm happy that the mapping
does indeed stay on the other forked processes. The test program is after
my signature for anyone else.
Thanks!
-peter
#include <sys/types.h>
#include <sys/mman.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <err.h>
int
main(void)
{
char *ptr;
pid_t pid;
int i;
ptr = mmap(NULL, 4096, PROT_READ | PROT_WRITE, MAP_SHARED |\
MAP_ANON, -1, 0);
if (ptr == MAP_FAILED) {
err(1, "mmap");
exit(1);
}
memset(ptr, 0x32, 4096);
pid = fork();
switch (pid) {
case -1:
err(1, "fork");
break;
case 0:
if (munmap(ptr, 4096) == -1)
err(1, "munmap");
for (;;)
sleep(10);
break;
default:
printf("continuing from forking to pid %d\n", pid);
break;
}
pid = fork();
switch (pid) {
case -1:
err(1, "fork");
break;
case 0:
sleep(2);
memset(ptr, 0x42, 4096);
for (;;)
sleep(10);
break;
default:
printf("continuing from forking to pid %d\n", pid);
break;
}
sleep(5);
printf("printing the first 16 bytes from shared memory\n");
for (i = 0; i < 16; i++) {
printf("%02x, ", ptr[i] & 0xff);
}
printf("\n");
sleep(30);
exit(0);
}