On Thu, Mar 8, 2012 at 1:24 PM, Frank Denis <a...@me.com> wrote:
> See http://download.pureftpd.org/misc/OpenBSD/patches/posix_spawn.diff

Hi Frank,

I briefly looked over this code, and the diff looks good to me except
for one subtle FreeBSDism: memory writes done in a vfork(2)'d child
process will not affect the parent process.  This is critical for how
FreeBSD's posix_spawn() propagates errors from the spawned child
process.

I haven't tested this, but I suspect if (e.g.) you try to
posix_spawn() a non-existent program, that posix_spawn() will still
return a successful return value.

Instead of using a volatile int on the stack, you'll need to allocate
some extra memory using mmap and MAP_SHARED.  E.g., see the sample
program below.

If you can fix that, I think it's good to commit.  Some regress tests
would be good too though.  (However, I'll be offline until March 18
though, so someone else will need to actually commit it.)

Thanks!


$ ./beep
error=42

$ cat beep.c
#include <sys/mman.h>
#include <unistd.h>
#include <stdio.h>
#include <err.h>

int main()
{
 void *mem;
 volatile int *errorp;

 mem = mmap(0, sizeof(*errorp), PROT_READ|PROT_WRITE,
   MAP_SHARED|MAP_ANON, -1, 0);
 if (mem == MAP_FAILED) err(100, "mmap");
 errorp = mem;
 *errorp = 0;

 switch (vfork()) {
 case -1: err(100, "vfork\n"); return 0; break;
 case 0: *errorp = 42; return 0; break;
 }

 printf("error=%d\n", *errorp);
 if (munmap(mem, sizeof(*errorp)) == -1) err(100, "munmap");
 return 0;
}

Reply via email to