Follow @Openwall on Twitter for new release announcements and other news
[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <CANP3RGcdM-GN4QLWZzumbV0Vi-3kPwD2gJHp-jeKUfkrnUOW7A@mail.gmail.com>
Date: Mon, 24 Jan 2022 14:08:05 -0800
From: Maciej Żenczykowski <maze@...gle.com>
To: Florian Weimer <fweimer@...hat.com>
Cc: enh <enh@...gle.com>, libc-coord@...ts.openwall.com
Subject: Re: posix_spawn() support for close_range(CLOSE_RANGE_CLOEXEC)

On Mon, Jan 24, 2022 at 1:24 PM Florian Weimer <fweimer@...hat.com> wrote:
>
> > we have a proposal to add a new posix_spawn() flag to bionic
> > (Android's libc) that would mark all file descriptors not otherwise
> > mentioned as close-on-exec.
> >
> > (see https://android-review.googlesource.com/c/platform/bionic/+/1955269
> > for the proposed implementation.)
> >
> > anyone aware of any other work in this kind of direction?
>
> Solaris and glibc have posix_spawn_file_actions_addclosefrom_np (Solaris
> was first).  Given that the execve is unavoidable (except for errors),
> that seems pretty much equivalent.  Perhaps POSIX_SPAWN_CLOEXEC_DEFAULT
> is a little bit easier to use?

Right, I realized that basically what I want/need is to close
everything except for a specific set of fds.
That set is stdin/out/err (closing these before exec is just a really
bad idea, they should at the minimum be /dev/null) and any file
descriptors I'm explicitly trying to pass (which requires explicit
posix_spawn_actions_adddup2 (maybe addopen) calls or it's racy wrt
other threads, since if they're opened pre-posix_spawn, then they
need/should be opened with O_CLOEXEC anyway, and we don't have a
posix_spawn_actions_adduncloexec helper besides dup2 - note that
dup2(X, X) doesn't work to unset O_CLOEXEC).

adddup2 is also better than addopen, because it allows for better
error handling (dup2 is unlikely to fail, open much more so, logging
prior to posix_spawn() is easier).

Hence, this approach seems to be by far the easiest to use.
Just set the flag, and your code works and doesn't leak fds any more
even if other threads are forgetting to set O_CLOEXEC and/or racing
with you.

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.