On Thu, Sep 6, 2018 at 8:28 AM, Tycho Andersen [off-list ref] wrote:
The idea here is that the userspace handler should be able to pass an fd
back to the trapped task, for example so it can be returned from socket().
I've proposed one API here, but I'm open to other options. In particular,
this only lets you return an fd from a syscall, which may not be enough in
all cases. For example, if an fd is written to an output parameter instead
of returned, the current API can't handle this. Another case is that
netlink takes as input fds sometimes (IFLA_NET_NS_FD, e.g.). If netlink
ever decides to install an fd and output it, we wouldn't be able to handle
this either.
An alternative could be to have an API (an ioctl on the listener,
perhaps) that just copies an fd into the tracee. There would be the
obvious set of options: do we replace an existing fd or allocate a new
one, and is it CLOEXEC. Then the tracer could add an fd and then
return it just like it's a regular number.
I feel like this would be more flexible and conceptually simpler, but
maybe a little slower for the common cases. What do you think?