1. 13 10月, 2013 1 次提交
    • R
      fix uid/gid-setting error in faccessat with AT_EACCESS flag · 51635856
      Rich Felker 提交于
      this fixes an issue reported by Daniel Thau whereby faccessat with the
      AT_EACCESS flag did not work in cases where the process is running
      suid or sgid but without root privileges. per POSIX, when the process
      does not have "appropriate privileges", setuid changes the euid, not
      the real uid, and the target uid must be equal to the current real or
      saved uid; if this condition is not met, EPERM results. this caused
      the faccessat child process to fail.
      
      using the setreuid syscall rather than setuid works. POSIX leaves it
      unspecified whether setreuid can set the real user id to the effective
      user id on processes without "appropriate privileges", but Linux
      allows this; if it's not allowed, there would be no way for this
      function to work.
      51635856
  2. 09 10月, 2013 1 次提交
    • R
      fix errno value for getcwd when size argument is zero · 4fb7df12
      Rich Felker 提交于
      based on patch by Michael Forney. at the same time, I've changed the
      if branch to be more clear, avoiding the comma operator.
      
      the underlying issue is that Linux always returns ERANGE when size is
      too short, even when it's zero, rather than returning EINVAL for the
      special case of zero as required by POSIX.
      4fb7df12
  3. 01 9月, 2013 1 次提交
  4. 10 8月, 2013 1 次提交
  5. 03 8月, 2013 3 次提交
    • R
      fix faccessat to support AT_EACCESS flag · 0a05eace
      Rich Felker 提交于
      this is another case of the kernel syscall failing to support flags
      where it needs to, leading to horrible workarounds in userspace. this
      time the workaround requires changing uid/gid, and that's not safe to
      do in the current process. in the worst case, kernel resource limits
      might prevent recovering the original values, and then there would be
      no way to safely return. so, use the safe but horribly inefficient
      alternative: forking. clone is used instead of fork to suppress
      signals from the child.
      
      fortunately this worst-case code is only needed when effective and
      real ids mismatch, which mainly happens in suid programs.
      0a05eace
    • R
      make fchdir, fchmod, fchown, and fstat support O_PATH file descriptors · 9ca1f62b
      Rich Felker 提交于
      on newer kernels, fchdir and fstat work anyway. this same fix should
      be applied to any other syscalls that are similarly affected.
      
      with this change, the current definitions of O_SEARCH and O_EXEC as
      O_PATH are mostly conforming to POSIX requirements. the main remaining
      issue is that O_NOFOLLOW has different semantics.
      9ca1f62b
    • R
      debloat code that depends on /proc/self/fd/%d with shared function · c8c0844f
      Rich Felker 提交于
      I intend to add more Linux workarounds that depend on using these
      pathnames, and some of them will be in "syscall" functions that, from
      an anti-bloat standpoint, should not depend on the whole snprintf
      framework.
      c8c0844f
  6. 09 7月, 2013 2 次提交
  7. 25 3月, 2013 1 次提交
  8. 04 2月, 2013 1 次提交
  9. 11 12月, 2012 1 次提交
  10. 25 10月, 2012 1 次提交
    • R
      greatly improve freopen behavior · 892cafff
      Rich Felker 提交于
      1. don't open /dev/null just as a basis to copy flags; use shared
      __fmodeflags function to get the right file flags for the mode.
      
      2. handle the case (probably invalid, but whatever) case where the
      original stream's file descriptor was closed; previously, the logic
      re-closed it.
      
      3. accept the "e" mode flag for close-on-exec; update dup3 to fallback
      to using dup2 so we can simply call __dup3 instead of putting fallback
      logic in freopen itself.
      892cafff
  11. 19 10月, 2012 1 次提交
    • 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
  12. 30 9月, 2012 1 次提交
  13. 29 9月, 2012 1 次提交
  14. 25 9月, 2012 1 次提交
    • R
      fix handling of EINTR during close() · 82dc1e2e
      Rich Felker 提交于
      austin group interpretation for defect #529
      (http://austingroupbugs.net/view.php?id=529) tightens the
      requirements on close such that, if it returns with EINTR, the file
      descriptor must not be closed. the linux kernel developers vehemently
      disagree with this, and will not change it. we catch and remap EINTR
      to EINPROGRESS, which the standard allows close() to return when the
      operation was not finished but the file descriptor has been closed.
      82dc1e2e
  15. 10 9月, 2012 2 次提交
  16. 09 9月, 2012 1 次提交
  17. 07 9月, 2012 3 次提交
    • R
      further use of _Noreturn, for non-plain-C functions · 0c05bd3a
      Rich Felker 提交于
      note that POSIX does not specify these functions as _Noreturn, because
      POSIX is aligned with C99, not the new C11 standard. when POSIX is
      eventually updated to C11, it will almost surely give these functions
      the _Noreturn attribute. for now, the actual _Noreturn keyword is not
      used anyway when compiling with a c99 compiler, which is what POSIX
      requires; the GCC __attribute__ is used instead if it's available,
      however.
      
      in a few places, I've added infinite for loops at the end of _Noreturn
      functions to silence compiler warnings. presumably
      __buildin_unreachable could achieve the same thing, but it would only
      work on newer GCCs and would not be portable. the loops should have
      near-zero code size cost anyway.
      
      like the previous _Noreturn commit, this one is based on patches
      contributed by philomath.
      0c05bd3a
    • 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
    • R
      fcfba995
  18. 11 7月, 2012 1 次提交
    • R
      initial version of mips (o32) port, based on work by Richard Pennington (rdp) · 6315004f
      Rich Felker 提交于
      basically, this version of the code was obtained by starting with
      rdp's work from his ellcc source tree, adapting it to musl's build
      system and coding style, auditing the bits headers for discrepencies
      with kernel definitions or glibc/LSB ABI or large file issues, fixing
      up incompatibility with the old binutils from aboriginal linux, and
      adding some new special cases to deal with the oddities of sigaction
      and pipe syscall interfaces on mips.
      
      at present, minimal test programs work, but some interfaces are broken
      or missing. threaded programs probably will not link.
      6315004f
  19. 20 6月, 2012 3 次提交
  20. 25 5月, 2012 1 次提交
  21. 02 3月, 2012 1 次提交
  22. 26 9月, 2011 1 次提交
    • R
      cleanup various minor issues reported by nsz · fd142e5e
      Rich Felker 提交于
      the changes to syscall_ret are mostly no-ops in the generated code,
      just cleanup of type issues and removal of some implementation-defined
      behavior. the one exception is the change in the comparison value,
      which is fixed so that 0xf...f000 (which in principle could be a valid
      return value for mmap, although probably never in reality) is not
      treated as an error return.
      fd142e5e
  23. 22 9月, 2011 1 次提交
  24. 14 9月, 2011 1 次提交
  25. 30 7月, 2011 3 次提交
    • R
      fix some bugs in setxid and update setrlimit to use __synccall · 544ee752
      Rich Felker 提交于
      setrlimit is supposed to be per-process, not per-thread, but again
      linux gets it wrong. work around this in userspace. not only is it
      needed for correctness; setxid also depends on the resource limits for
      all threads being the same to avoid situations where temporarily
      unlimiting the limit succeeds in some threads but fails in others.
      544ee752
    • R
      afade235
    • R
      new attempt at making set*id() safe and robust · acb04806
      Rich Felker 提交于
      changing credentials in a multi-threaded program is extremely
      difficult on linux because it requires synchronizing the change
      between all threads, which have their own thread-local credentials on
      the kernel side. this is further complicated by the fact that changing
      the real uid can fail due to exceeding RLIMIT_NPROC, making it
      possible that the syscall will succeed in some threads but fail in
      others.
      
      the old __rsyscall approach being replaced was robust in that it would
      report failure if any one thread failed, but in this case, the program
      would be left in an inconsistent state where individual threads might
      have different uid. (this was not as bad as glibc, which would
      sometimes even fail to report the failure entirely!)
      
      the new approach being committed refuses to change real user id when
      it cannot temporarily set the rlimit to infinity. this is completely
      POSIX conformant since POSIX does not require an implementation to
      allow real-user-id changes for non-privileged processes whatsoever.
      still, setting the real uid can fail due to memory allocation in the
      kernel, but this can only happen if there is not already a cached
      object for the target user. thus, we forcibly serialize the syscalls
      attempts, and fail the entire operation on the first failure. this
      *should* lead to an all-or-nothing success/failure result, but it's
      still fragile and highly dependent on kernel developers not breaking
      things worse than they're already broken.
      
      ideally linux will eventually add a CLONE_USERCRED flag that would
      give POSIX conformant credential changes without any hacks from
      userspace, and all of this code would become redundant and could be
      removed ~10 years down the line when everyone has abandoned the old
      broken kernels. i'm not holding my breath...
      acb04806
  26. 22 4月, 2011 1 次提交
  27. 21 4月, 2011 1 次提交
    • R
      workaround bug in linux dup2 · f9a6372a
      Rich Felker 提交于
      the linux documentation for dup2 says it can fail with EBUSY due to a
      race condition with open and dup in the kernel. shield applications
      (and the rest of libc) from this nonsense by looping until it succeeds
      f9a6372a
  28. 19 4月, 2011 1 次提交
    • R
      remove bogus extra logic for close cancellability · 61b56a8d
      Rich Felker 提交于
      like all other syscalls, close should return to the caller if and only
      if it successfully performed its action. it is necessary that the
      application be able to determine whether the close succeeded.
      61b56a8d
  29. 18 4月, 2011 1 次提交
  30. 17 4月, 2011 1 次提交
    • R
      overhaul pthread cancellation · feee9890
      Rich Felker 提交于
      this patch improves the correctness, simplicity, and size of
      cancellation-related code. modulo any small errors, it should now be
      completely conformant, safe, and resource-leak free.
      
      the notion of entering and exiting cancellation-point context has been
      completely eliminated and replaced with alternative syscall assembly
      code for cancellable syscalls. the assembly is responsible for setting
      up execution context information (stack pointer and address of the
      syscall instruction) which the cancellation signal handler can use to
      determine whether the interrupted code was in a cancellable state.
      
      these changes eliminate race conditions in the previous generation of
      cancellation handling code (whereby a cancellation request received
      just prior to the syscall would not be processed, leaving the syscall
      to block, potentially indefinitely), and remedy an issue where
      non-cancellable syscalls made from signal handlers became cancellable
      if the signal handler interrupted a cancellation point.
      
      x86_64 asm is untested and may need a second try to get it right.
      feee9890