1. 06 11月, 2017 1 次提交
    • R
      adjust posix_spawn dup2 action behavior to match future requirements · 6fc6ca1a
      Rich Felker 提交于
      the resolution to Austin Group issue #411 defined new semantics for
      the posix_spawn dup2 file action in the (previously useless) case
      where src and dest fd are equal. future issues will require the dup2
      file action to remove the close-on-exec flag. without this change,
      passing fds to a child with posix_spawn while avoiding fd-leak races
      in a multithreaded parent required a complex dance with temporary fds.
      
      based on patch by Petr Skocik. changes were made to preserve the
      80-column formatting of the function and to remove code that became
      unreachable as a result of the new functionality.
      6fc6ca1a
  2. 01 11月, 2017 1 次提交
  3. 25 10月, 2017 1 次提交
    • R
      fix build regression on ARM for ISA levels less than v5 · 1b9406b0
      Rich Felker 提交于
      commit 06fbefd1 (first included in
      release 1.1.17) introduced this regression.
      
      patch by Adrian Bunk. it fixes the regression in all cases, but
      spuriously prevents use of the clz instruction on very old compiler
      versions that don't define __ARM_ARCH. this may be fixed in a more
      general way at some point in the future. it also omits thumb1 logic
      since building as thumb1 code is currently not supported.
      1b9406b0
  4. 22 10月, 2017 1 次提交
    • R
      fix regression in glob with literal . or .. path component · ec04d122
      Rich Felker 提交于
      commit 8c4be3e2 was written to
      preclude the GLOB_PERIOD extension from matching these directory
      entries, but also precluded literal matches.
      
      adjust the check that excludes . and .. to check whether the
      GLOB_PERIOD flag is in effect, so that it cannot alter behavior in
      cases governed by the standard, and also don't exclude . or .. in any
      case where normal glob behavior (fnmatch's FNM_PERIOD flag) would have
      included one or both of them (patterns such as ".*").
      
      it's still not clear whether this is the preferred behavior for
      GLOB_PERIOD, but at least it's clear that it can no longer break
      applications which are not relying on quirks of a nonstandard feature.
      ec04d122
  5. 20 10月, 2017 2 次提交
    • W
      posix_spawn: use larger stack to cover worst-case in execvpe · 004dc954
      Will Dietz 提交于
      execvpe stack-allocates a buffer used to hold the full path
      (combination of a PATH entry and the program name)
      while searching through $PATH, so at least
      NAME_MAX+PATH_MAX is needed.
      
      The stack size can be made conditionally smaller
      (the current 1024 appears appropriate)
      should this larger size be burdensome in those situations.
      004dc954
    • R
      release 1.1.17 · 2cd663fb
      Rich Felker 提交于
      2cd663fb
  6. 19 10月, 2017 1 次提交
    • R
      in dns parsing callback, enforce MAXADDRS to preclude overflow · 45ca5d3f
      Rich Felker 提交于
      MAXADDRS was chosen not to need enforcement, but the logic used to
      compute it assumes the answers received match the RR types of the
      queries. specifically, it assumes that only one replu contains A
      record answers. if the replies to both the A and the AAAA query have
      their answer sections filled with A records, MAXADDRS can be exceeded
      and clobber the stack of the calling function.
      
      this bug was found and reported by Felix Wilhelm.
      45ca5d3f
  7. 14 10月, 2017 3 次提交
    • R
      fix incorrect base name offset from nftw when pathname ends in slash(es) · 5b5eb527
      Rich Felker 提交于
      the rightmost '/' character is not necessarily the delimiter before
      the basename; it could be a spurious trailing character on the
      directory name.
      
      this change does not introduce any normalization of pathnames or
      stripping of trailing slashes, contrary to at least glibc and perhaps
      other implementations; it jusst prevents their presence from breaking
      things. whether further changes should be made is an open question
      that may depend on conformance and/or application compatibility
      considerations.
      
      based loosely on patch by Joakim Sindholt.
      5b5eb527
    • R
      fix read-after-free type error in pthread_detach · c1e27367
      Rich Felker 提交于
      calling __unlock on t->exitlock is not valid because __unlock reads
      the waiters count after making the atomic store that could allow
      pthread_exit to continue and unmap the thread's stack and the object t
      points to. for now, inline the __unlock logic with an unconditional
      futex wake operation so that the waiters count is not needed.
      
      once __lock/__unlock have been made safe for self-synchronized
      destruction, we could switch back to using them.
      c1e27367
    • S
      math: rewrite fma with mostly int arithmetics · 90747692
      Szabolcs Nagy 提交于
      the freebsd fma code failed to raise underflow exception in some
      cases in nearest rounding mode (affects fmal too) e.g.
      
        fma(-0x1p-1000, 0x1.000001p-74, 0x1p-1022)
      
      and the inexact exception may be raised spuriously since the fenv
      is not saved/restored around the exact multiplication algorithm
      (affects x86 fma too).
      
      another issue is that the underflow behaviour when the rounded result
      is the minimal normal number is target dependent, ieee754 allows two
      ways to raise underflow for inexact results: raise if the result before
      rounding is in the subnormal range (e.g. aarch64, arm, powerpc) or if
      the result after rounding with infinite exponent range is in the
      subnormal range (e.g. x86, mips, sh).
      
      to avoid all these issues the algorithm was rewritten with mostly int
      arithmetics and float arithmetics is only used to get correct rounding
      and raise exceptions according to the behaviour of the target without
      any fenv.h dependency. it also unifies x86 and non-x86 fma.
      
      fmaf is not affected, fmal need to be fixed too.
      
      this algorithm depends on a_clz_64 and it required a few spurious
      instructions to make sure underflow exception is raised in a particular
      corner case. (normally FORCE_EVAL(tiny*tiny) would be used for this,
      but on i386 gcc is broken if the expression is constant
      https://gcc.gnu.org/bugzilla/show_bug.cgi?id=57245
      and there is no easy portable fix for the macro.)
      90747692
  8. 13 10月, 2017 2 次提交
    • R
      for executing init array functions, use function type with prototype · b3516058
      Rich Felker 提交于
      this is for consistency with the way it's done in in the dynamic
      linker, avoiding a deprecated C feature (non-prototype function
      types), and improving code generation. GCC unnecessarily uses the
      variadic calling convention (e.g. clearing rax on x86_64) when making
      a call where the argument types are not known for compatibility with
      wrong code which calls variadic functions this way. (C on the other
      hand is clear that such calls have undefined behavior.)
      b3516058
    • R
      fix access by setjmp and longjmp to __hwcap on arm built as thumb2 · e364774d
      Rich Felker 提交于
      this is a subtle issue with how the assembler/linker work. for the adr
      pseudo-instruction used to find __hwcap, the assembler in thumb mode
      generates a 16-bit thumb add instruction which can only represent
      word-aligned addresses, despite not knowing the alignment of the
      label. if the setjmp function is assigned a non-multiple-of-4 address
      at link time, the load then loads from the wrong address (the last
      instruction rather than the data containing the offset) and ends up
      reading nonsense instead of the value of __hwcap. this in turn causes
      the checks for floating-point/vector register sets (e.g. IWMMX) to
      evaluate incorrectly, crashing when setjmp/longjmp try to save/restore
      those registers.
      
      fix based on bug report by Felix Hädicke.
      e364774d
  9. 29 9月, 2017 1 次提交
  10. 12 9月, 2017 1 次提交
  11. 07 9月, 2017 5 次提交
    • R
      work around incorrect EPERM from mmap syscall · da438ee1
      Rich Felker 提交于
      under some conditions, the mmap syscall wrongly fails with EPERM
      instead of ENOMEM when memory is exhausted; this is probably the
      result of the kernel trying to fit the allocation somewhere that
      crosses into the kernel range or below mmap_min_addr. in any case it's
      a conformance bug, so work around it. for now, only handle the case of
      anonymous mappings with no requested address; in other cases EPERM may
      be a legitimate error.
      
      this indirectly fixes the possibility of malloc failing with the wrong
      errno value.
      da438ee1
    • R
      fix glob descent into . and .. with GLOB_PERIOD · 8c4be3e2
      Rich Felker 提交于
      GLOB_PERIOD is a gnu extension, and GNU glob does not seem to honor it
      except in the last path component. it's not clear whether this a bug
      or intentional, but it seems reasonable that it should exclude the
      special entries . and .. when walking.
      
      changes based on report and analysis by Julien Ramseier.
      8c4be3e2
    • R
      don't treat numeric port strings as servent records in getservby*() · 565dbee2
      Rich Felker 提交于
      some applications use getservbyport to find port numbers that are not
      assigned to a service; if getservbyport always succeeds with a numeric
      string as the result, they fail to find any available ports.
      
      POSIX doesn't seem to mandate the behavior one way or another. it
      specifies an abstract service database, which an implementation could
      define to include numeric port strings, but it makes more sense to
      align behavior with traditional implementations.
      
      based on patch by A. Wilcox. the original patch only changed
      getservbyport[_r]. to maintain a consistent view of the "service
      database", I have also modified getservbyname[_r] to exclude numeric
      port strings.
      565dbee2
    • R
      fix signal masking race in pthread_create with priority attributes · 9e01be6e
      Rich Felker 提交于
      if the parent thread was able to set the new thread's priority before
      it reached the check for 'startlock', the new thread failed to restore
      its signal mask and thus ran with all signals blocked.
      
      concept for patch by Sergei, who reported the issue; unnecessary
      changes were removed and comments added since the whole 'startlock'
      thing is non-idiomatic and confusing. eventually it should be replaced
      with use of idiomatic synchronization primitives.
      9e01be6e
    • S
      make syscall.h consistent with linux · 822dddfb
      Szabolcs Nagy 提交于
      most of the found naming differences don't matter to musl, because
      internally it unifies the syscall names that vary across targets,
      but for external code the names should match the kernel uapi.
      
      aarch64:
      	__NR_fstatat is called __NR_newfstatat in linux.
      	__NR_or1k_atomic got mistakenly copied from or1k.
      arm:
      	__NR_arm_sync_file_range is an alias for __NR_sync_file_range2
      	__NR_fadvise64_64 is called __NR_arm_fadvise64_64 in linux,
      	the old non-arm name is kept too, it should not cause issues.
      	(powerpc has similar nonstandard fadvise and it uses the
      	normal name.)
      i386:
      	__NR_madvise1 was removed from linux in commit
      	303395ac3bf3e2cb488435537d416bc840438fcb 2011-11-11
      microblaze:
      	__NR_fadvise, __NR_fstatat, __NR_pread, __NR_pwrite
      	had different name in linux.
      mips:
      	__NR_fadvise, __NR_fstatat, __NR_pread, __NR_pwrite, __NR_select
      	had different name in linux.
      mipsn32:
      	__NR_fstatat is called __NR_newfstatat in linux.
      or1k:
      	__NR__llseek is called __NR_llseek in linux.
      	the old name is kept too because that's the name musl uses
      	internally.
      powerpc:
      	__NR_{get,set}res{gid,uid}32 was never present in powerpc linux.
      	__NR_timerfd was briefly defined in linux but then got renamed.
      822dddfb
  12. 05 9月, 2017 4 次提交
    • B
      handle whitespace before %% in scanf · 9255dad9
      Bartosz Brachaczek 提交于
      this is mandated by C and POSIX standards and is in accordance with
      glibc behavior.
      9255dad9
    • A
      fix OOB reads in Xbyte_memmem · 51bdcdc4
      Alexander Monakov 提交于
      Reported by Leah Neukirchen.
      51bdcdc4
    • A
      free allocations in clearenv · cc0dbd5f
      Alexander Monakov 提交于
      This aligns clearenv with the Linux man page by setting 'environ'
      rather than '*environ' to NULL, and stops it from leaking entries
      allocated by the libc.
      cc0dbd5f
    • A
      overhaul environment functions · 8e932792
      Alexander Monakov 提交于
      Rewrite environment access functions to slim down code, fix bugs and
      avoid invoking undefined behavior.
      
      * avoid using int-typed iterators where size_t would be correct;
      * use strncmp instead of memcmp consistently;
      * tighten prologues by invoking __strchrnul;
      * handle NULL environ.
      
      putenv:
      * handle "=value" input via unsetenv too (will return -1/EINVAL);
      * rewrite and simplify __putenv; fix the leak caused by failure to
        deallocate entry added by preceding setenv when called from putenv.
      
      setenv:
      * move management of libc-allocated entries to this translation unit,
        and use no-op weak symbols in putenv/unsetenv;
      
      unsetenv:
      * rewrite; this fixes UB caused by testing a free'd pointer against
        NULL on entry to subsequent loops.
      
      Not changed:
      Failure to extend allocation tracking array (previously __env_map, now
      env_alloced) is ignored rather than causing to report -1/ENOMEM to the
      caller; the worst-case consequence is leaking this allocation when it
      is removed or replaced in a subsequent environment access.
      
      Initially UB in unsetenv was reported by Alexander Cherepanov.
      Using a weak alias to avoid pulling in malloc via unsetenv was
      suggested by Rich Felker.
      8e932792
  13. 02 9月, 2017 1 次提交
  14. 01 9月, 2017 1 次提交
    • R
      fix erroneous stop before input limit in mbsnrtowcs and wcsnrtombs · 11ddc314
      Rich Felker 提交于
      the value computed as an output limit that bounds the amount of input
      consumed below the input limit was incorrectly being used as the
      actual amount of input consumed. instead, compute the actual amount of
      input consumed as a difference of pointers before and after the
      conversion.
      
      patch by Mikhail Kremnyov.
      11ddc314
  15. 30 8月, 2017 10 次提交
  16. 12 8月, 2017 5 次提交
    • D
      fix signed overflow in ftok · 511b7042
      Daniel Sabogal 提交于
      511b7042
    • T
      fix build failure for sh4a due to missing colon in asm statement · 1698fe6c
      Thomas Petazzoni 提交于
      Due to a missing ":" in an asm() statement, the "memory" clobber is
      considered by gcc as an input operand and not a clobber, which causes a
      build failure.
      1698fe6c
    • R
      trap UB from attempts to join a detached thread · 80bf5952
      Rich Felker 提交于
      passing to pthread_join the id of a thread which is not joinable
      results in undefined behavior.
      
      in principle the check to trap does not necessarily work if
      pthread_detach was called after thread creation, since no effort is
      made here to synchronize access to t->detached, but the check is
      well-defined and harmless for callers which did not invoke UB, and
      likely to help catch erroneous code that would otherwise mysteriously
      hang.
      
      patch by William Pitcock.
      80bf5952
    • B
      ppc64: fix setjmp/longjmp handling of TOC pointer · e31c8c2d
      Bobby Bingham 提交于
      The TOC pointer is constant within a single dso, but needs to be saved
      and restored around cross-dso calls.  The PLT stub saves it to the
      caller's stack frame, and the linker adds code to the caller to restore
      it.
      
      With a local call, as within a single dso or with static linking, this
      doesn't happen and the TOC pointer is always in r2.  Therefore,
      setjmp/longjmp need to save/restore the TOC pointer from/to different
      locations depending on whether the call to setjmp was a local or non-local
      call.
      
      It is always safe for longjmp to restore to both r2 and the caller's stack.
      If the call to setjmp was local, and only r2 matters and the stack location
      will be ignored, but is required by the ABI to be reserved for the TOC
      pointer.  If the call was non-local, then only the stack location matters,
      and whatever is restored into r2 will be clobbered anyway when the caller
      reloads r2 from the stack.
      
      A little extra care is required for sigsetjmp, because it uses setjmp
      internally.  After the second return from this setjmp call, r2 will contain
      the caller's TOC pointer instead of libc's TOC pointer.  We need to save
      and restore the correct libc pointer before we can tail call to
      __sigsetjmp_tail.
      e31c8c2d
    • L
      qsort: add a short comment about the algorithm · 52cf5c18
      Leah Neukirchen 提交于
      52cf5c18