Follow @Openwall on Twitter for new release announcements and other news
[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Date: Sun, 3 Feb 2013 21:36:37 +0100
From: Szabolcs Nagy <>
Subject: Re: vfork replacement proposal

* Rich Felker <> [2013-02-03 13:49:23 -0500]:
> On Mon, Dec 31, 2012 at 03:34:17PM -0500, Rich Felker wrote:
> > 4. In the child, close the read end of the pipe and then shuffle file
> > descriptors as needed (for setting up stdin/out for popen, or file
> > actions for posix_spawn[p]), but with the added stipulations A-C:
> > 
> > A. Before closing or dup2'ing onto a file descriptor in file actions,
> > check to see if it's occupied by the pipe fd, and if so, use fcntl
> > F_DUPFD_CLOEXEC to move it to a new number first.
> > 
> > B. Before calling open in file actions, always use fcntl with
> > F_DUPFD_CLOEXEC and close the original pipe fd, to ensure that the
> > pipe is never occupying the otherwise-lowest-available fd number.
> I was wrong about (B); the "open" file action does not assign the
> lowest-available fd, but a caller-chosen fd. Thus, for our purposes,
> it's just like close or dup2, targetting a known fd number. This means
> the same logic can be used for all three operations, and it can be
> based on dup() rather than F_DUPFD_CLOEXEC. Note that F_DUPFD_CLOEXEC
> is actually not viable because it's missing on slightly-old kernels
> (up through mid 2.6 series), but we don't need atomicity anyway since
> this thread/process is fully under posix_spawn's control.
> Also, I think it would be possible to abandon the "shuffling" logic
> and compute in advance a safe fd number to put the pipe on. 
> Finally, it seems posix_spawn will be sufficient as a backend for
> implementing popen, wordexp, and system, so I just put all the logic
> in posix_spawn itself rather than trying to design a more abstract API
> with callbacks for the specific caller case.

hm, is it possible to have a non-forking spawn that covers all the
fork+exec cases? (things one might want to do before exec, eg by
specifying extra attributes..)

as far as i can see posix_spawn handles these:

 fds (file_actions, O_CLOEXEC)
 drop euid, egid (POSIX_SPAWN_RESETIDS)

but not these:

 setuid, setgid, setgroups
 enable ptrace
 ioctl, setctty/noctty
 prctl, parent death signal
 (maybe others..)

Powered by blists - more mailing lists

Confused about mailing lists and their use? Read about mailing lists on Wikipedia and check out these guidelines on proper formatting of your messages.