public inbox for glibc-bugs@sourceware.org
help / color / mirror / Atom feed
From: "bugdal at aerifal dot cx" <sourceware-bugzilla@sourceware.org>
To: glibc-bugs@sourceware.org
Subject: [Bug nptl/17214] Expose a clone variant that shares stacks instead of jumping to a new one
Date: Fri, 19 Dec 2014 21:01:00 -0000	[thread overview]
Message-ID: <bug-17214-131-2LCzc2kWBz@http.sourceware.org/bugzilla/> (raw)
In-Reply-To: <bug-17214-131@http.sourceware.org/bugzilla/>

https://sourceware.org/bugzilla/show_bug.cgi?id=17214

--- Comment #14 from Rich Felker <bugdal at aerifal dot cx> ---
Your claim that "vfork sets all memory except the current stack as read only in
the process" is false and generally impossible to implement for various
reasons. At the kernel level vfork is identical to clone with
flags=CLONE_VM|CLONE_VFORK|SIGCHLD, and all CLONE_VFORK does is block
scheduling of the parent until the child successfully execs or terminates.

By "eliminated", I meant dropped from the standards and deprecated. Of course
it still exists in implementations that provide it, but the formalism for what
you can do after vfork is wrong with respect to compiler semantics and thus
it's unusable. For instance in the code:

if (!(pid = vfork())) {
    execve(...);
    _exit(1);
}

the traditional rules have been followed, but since _exit is a _Noreturn
function, the compiler is free to write the arguments for execve over top of
storage that was being used for local variables or spilled/saved registers in
the caller (assuming their addresses are not visible to execve). This is valid
because they can never be accessed again in the child. But since the child and
parent share memory, the parent's stack will be trashed when it resumes
execution. There are hacks that could be done at the compiler level to
recognize vfork as special and avoid this, but it's a game of whack-a-mole.
Sharing a stack between processes is just a broken design.

-- 
You are receiving this mail because:
You are on the CC list for the bug.


  parent reply	other threads:[~2014-12-19 21:01 UTC|newest]

Thread overview: 17+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2014-07-29 21:23 [Bug nptl/17214] New: Expose a function to reset the PID cache sstewartgallus00 at mylangara dot bc.ca
2014-07-30  4:07 ` [Bug nptl/17214] " carlos at redhat dot com
2014-07-30 17:39 ` sstewartgallus00 at mylangara dot bc.ca
2014-07-30 17:41 ` sstewartgallus00 at mylangara dot bc.ca
2014-07-31 23:25 ` carlos at redhat dot com
2014-08-01 21:59 ` sstewartgallus00 at mylangara dot bc.ca
2014-08-26  4:38 ` bugdal at aerifal dot cx
2014-08-26 18:11 ` sstewartgallus00 at mylangara dot bc.ca
2014-08-26 18:31 ` sstewartgallus00 at mylangara dot bc.ca
2014-10-30 22:01 ` rickyz at chromium dot org
2014-12-18  0:15 ` jld at mozilla dot com
2014-12-18 23:58 ` [Bug nptl/17214] Expose a clone variant that shares stacks instead of jumping to a new one sstewartgallus00 at mylangara dot bc.ca
2014-12-19  0:13 ` sstewartgallus00 at mylangara dot bc.ca
2014-12-19  1:17 ` bugdal at aerifal dot cx
2014-12-19 20:29 ` sstewartgallus00 at mylangara dot bc.ca
2014-12-19 21:01 ` bugdal at aerifal dot cx [this message]
2015-01-26 22:33 ` sstewartgallus00 at mylangara dot bc.ca

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=bug-17214-131-2LCzc2kWBz@http.sourceware.org/bugzilla/ \
    --to=sourceware-bugzilla@sourceware.org \
    --cc=glibc-bugs@sourceware.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).