1. 27 4月, 2013 1 次提交
    • R
      remove explicit locking to prevent __synccall setuid during posix_spawn · a0473a0c
      Rich Felker 提交于
      for the duration of the vm-sharing clone used by posix_spawn, all
      signals are blocked in the parent process, including
      implementation-internal signals. since __synccall cannot do anything
      until successfully signaling all threads, the fact that signals are
      blocked automatically yields the necessary safety.
      
      aside from debloating and general simplification, part of the
      motivation for removing the explicit lock is to simplify the
      synchronization logic of __synccall in hopes that it can be made
      async-signal-safe, which is needed to make setuid and setgid, which
      depend on __synccall, conform to the standard. whether this will be
      possible remains to be seen.
      a0473a0c
  2. 04 2月, 2013 2 次提交
    • R
      fix unsigned comparison bug in posix_spawn · 4862864f
      Rich Felker 提交于
      read should never return anything but 0 or sizeof ec here, but if it
      does, we want to treat any other return as "success". then the caller
      will get back the pid and is responsible for waiting on it when it
      immediately exits.
      4862864f
    • R
      overhaul posix_spawn to use CLONE_VM instead of vfork · fb6b159d
      Rich Felker 提交于
      the proposed change was described in detail in detail previously on
      the mailing list. in short, vfork is unsafe because:
      
      1. the compiler could make optimizations that cause the child to
      clobber the parent's local vars.
      
      2. strace is buggy and allows the vforking parent to run before the
      child execs when run under strace.
      
      the new design uses a close-on-exec pipe instead of vfork semantics to
      synchronize the parent and child so that the parent does not return
      before the child has finished using its arguments (and now, also its
      stack). this also allows reporting exec failures to the caller instead
      of giving the caller a child that mysteriously exits with status 127
      on exec error.
      
      basic testing has been performed on both the success and failure code
      paths. further testing should be done.
      fb6b159d
  3. 20 10月, 2012 1 次提交
    • R
      fix usage of locks with vfork · 599f9736
      Rich Felker 提交于
      __release_ptc() is only valid in the parent; if it's performed in the
      child, the lock will be unlocked early then double-unlocked later,
      corrupting the lock state.
      599f9736
  4. 19 10月, 2012 2 次提交
    • R
      fix parent-memory-clobber in posix_spawn (environ) · 97c8bdd8
      Rich Felker 提交于
      97c8bdd8
    • R
      overhaul system() and popen() to use vfork; fix various related bugs · 44eb4d8b
      Rich Felker 提交于
      since we target systems without overcommit, special care should be
      taken that system() and popen(), like posix_spawn(), do not fail in
      processes whose commit charges are too high to allow ordinary forking.
      
      this in turn requires special precautions to ensure that the parent
      process's signal handlers do not end up running in the shared-memory
      child, where they could corrupt the state of the parent process.
      
      popen has also been updated to use pipe2, so it does not have a
      fd-leak race in multi-threaded programs. since pipe2 is missing on
      older kernels, (non-atomic) emulation has been added.
      
      some silly bugs in the old code should be gone too.
      44eb4d8b
  5. 15 10月, 2012 1 次提交
    • R
      block uid/gid changes during posix_spawn · d5304147
      Rich Felker 提交于
      usage of vfork creates a situation where a process of lower privilege
      may momentarily have write access to the memory of a process of higher
      privilege.
      
      consider the case of a multi-threaded suid program which is calling
      posix_spawn in one thread while another thread drops the elevated
      privileges then runs untrusted (relative to the elevated privilege)
      code as the original invoking user. this untrusted code can then
      potentially modify the data the child process will use before calling
      exec, for example changing the pathname or arguments that will be
      passed to exec.
      
      note that if vfork is implemented as fork, the lock will not be held
      until the child execs, but since memory is not shared it does not
      matter.
      d5304147
  6. 15 9月, 2012 1 次提交
    • R
      use vfork if possible in posix_spawn · d62f4e98
      Rich Felker 提交于
      vfork is implemented as the fork syscall (with no atfork handlers run)
      on archs where it is not available, so this change does not introduce
      any change in behavior or regression for such archs.
      d62f4e98
  7. 07 9月, 2012 1 次提交
    • R
      use restrict everywhere it's required by c99 and/or posix 2008 · 400c5e5c
      Rich Felker 提交于
      to deal with the fact that the public headers may be used with pre-c99
      compilers, __restrict is used in place of restrict, and defined
      appropriately for any supported compiler. we also avoid the form
      [restrict] since older versions of gcc rejected it due to a bug in the
      original c99 standard, and instead use the form *restrict.
      400c5e5c
  8. 14 9月, 2011 1 次提交
  9. 30 5月, 2011 1 次提交
  10. 29 5月, 2011 3 次提交