On Tue, May 13, 2014 at 8:06 AM, Илья Аржанников
<iarzhanni...@gmail.com>wrote:

> I am trying to use linux port systrace. And I found the problem. When I
> run under systrace (it does not matter with -A or -a (actually it never
> came till -a)) something that use vfork systrace and children processes
> hangup. I saw in sources that linux port uses ptrace as backend because
> it's not a native systrace subsystem. And linux systrace try to rewrite
> vfork system call on sys_clone, but it give nothing. With fork everything
> is ok, because fork is wrap around clone syscall and systrace just add one
> more flag to call it.
>
> Has anyone experience this problem?
>

This isn't too surprising: vfork() is defined as stopping the parent
process until the child exits or execs, but ptrace() works by reparenting
the target process, so the child that you're supposed to block for isn't
yours anymore.  Rewriting vfork() into a clone() call isn't any easier:
Linux follows the original semantics which preserve the the exact stack
contents and registers.  That's why on some Linux archs vfork() is a
syscall and not just a wrapper of clone(): clone() has so many args that it
requires stack manipulations that vfork() can't do.

Stepping back, I would suggest you look at what native control subsystems
are offered by Linux that might do what you need to do.  For example, can
your problem be solved with SELinux?

(systrace is only used in the OpenBSD base for some ports building work and
for sshd privsep sandboxing... but as soon as I or someone else comes up
with a simpler replacement for it for those functions, it'll be removed.)


Philip Guenther

Reply via email to