1. 18 4月, 2020 3 次提交
    • R
      combine two calls to memset in fmemopen · 74fa4aac
      Rich Felker 提交于
      this idea came up when I thought we might need to zero the UNGET
      portion of buf as well, but it seems like a useful improvement even
      when that turned out not to be necessary.
      74fa4aac
    • R
      fix possible access to uninitialized memory in shgetc (via scanf) · 086542fb
      Rich Felker 提交于
      shgetc sets up to be able to perform an "unget" operation without the
      caller having to remember and pass back the character value, and for
      this purpose used a conditional store idiom:
      
          if (f->rpos[-1] != c) f->rpos[-1] = c
      
      to make it safe to use with non-writable buffers (setup by the
      sh_fromstring macro or __string_read with sscanf).
      
      however, validity of this depends on the buffer space at rpos[-1]
      being initialized, which is not the case under some conditions
      (including at least unbuffered files and fmemopen ones).
      
      whenever data was read "through the buffer", the desired character
      value is already in place and does not need to be written. thus,
      rather than testing for the absence of the value, we can test for
      rpos<=buf, indicating that the last character read could not have come
      from the buffer, and thereby that we have a "real" buffer (possibly of
      zero length) with writable pushback (UNGET bytes) below it.
      086542fb
    • R
      fix undefined behavior in scanf core · b287cd74
      Rich Felker 提交于
      as reported/analyzed by Pascal Cuoq, the shlim and shcnt
      macros/functions are called by the scanf core (vfscanf) with f->rpos
      potentially null (if the FILE is not yet activated for reading at the
      time of the call). in this case, they compute differences between a
      null pointer (f->rpos) and a non-null one (f->buf), resulting in
      undefined behavior.
      
      it's unlikely that any observably wrong behavior occurred in practice,
      at least without LTO, due to limits on what's visible to the compiler
      from translation unit boundaries, but this has not been checked.
      
      fix is simply ensuring that the FILE is activated for read mode before
      entering the main scanf loop, and erroring out early if it can't be.
      b287cd74
  2. 25 3月, 2020 11 次提交
  3. 22 3月, 2020 2 次提交
    • S
      fix parsing offsets after long timezone names · 33338ebc
      Samuel Holland 提交于
      TZ containg a timezone name with >TZNAME_MAX characters currently
      breaks musl's timezone parsing. getname() stops after TZNAME_MAX
      characters. getoff() will consume no characters (because the next
      character is not a digit) and incorrectly return 0. Then, because
      there are remaining alphabetic characters, __daylight == 1, and
      dst_off == -3600.
      
      getname() must consume the entire timezone name, even if it will not
      fit in d/__tzname, so when it returns, s points to the offset digits.
      33338ebc
    • S
      avoid out-of-bounds read for invalid quoted timezone · 8e452aba
      Samuel Holland 提交于
      Parsing the timezone name must stop when reaching the null terminator.
      In that case, there is no '>' to skip.
      8e452aba
  4. 21 3月, 2020 2 次提交
  5. 15 3月, 2020 7 次提交
    • S
      define MAP_SYNC on powerpc/powerpc64 · 3e9d3386
      Samuel Holland 提交于
      Linux defines MAP_SYNC on powerpc and powerpc64 as of commit
      22fcea6f85f2 ("mm: move MAP_SYNC to asm-generic/mman-common.h"),
      so we can stop undefining it on those architectures.
      3e9d3386
    • T
      improve strerror speed · 8343334d
      Timo Teräs 提交于
      change the current O(n) lookup to O(1) based on the machinery
      described in "How To Write Shared Libraries" (Appendix B).
      8343334d
    • R
      fix corrupt sysvipc timestamps on 32-bit archs with old kernels · 2b2c8aaf
      Rich Felker 提交于
      kernel commit 4693916846269d633a3664586650dbfac2c5562f (first included
      in release v4.14) silently fixed a bug whereby the reserved space
      (which was later used for high bits of time) in IPC_STAT structures
      was left untouched rather than zeroed. this means that a caller that
      wants to read the high bits needs to pre-zero the memory.
      
      since it's not clear that these operations are permitted to modify the
      destination buffer on failure, use a temp buffer and copy back to the
      caller's buffer on success.
      2b2c8aaf
    • R
      work around negated error code bug on some mips kernels · 5db475f0
      Rich Felker 提交于
      on all mips variants, Linux did (and maybe still does) have some
      syscall return paths that wrongly return both the error flag in r7 and
      a negated error code in r2. in particular this happened for at least
      some causes of ENOSYS.
      
      add an extra check to only negate the error code if it's positive to
      begin with.
      
      bug report and concept for patch by Andreas Dröscher.
      5db475f0
    • R
      remove useless mips syscall asm constraint, align style with mips64/n32 · db86ec10
      Rich Felker 提交于
      commit 4221f154 added the r7
      constraint apparently out of a misunderstanding of the breakage it was
      addressing, and did so because the asm was in a shared macro used by
      all the __syscallN inline functions. now "+r" is used in the output
      section for the forms 4-argument and up, so having it in input is
      redundant, and the forms with 0-3 arguments don't need it as an input
      at all.
      
      the r2 constraint is kept because without it most gcc versions (seems
      to be all prior to 9.x) fail to honor the output register binding for
      r2. this seems to be a variant of gcc bug #87733.
      
      both the r7 and r2 input constraints look useless, but the r2 one was
      a quiet workaround for gcc bug 87733, which affects all modern
      versions prior to 9.x, so it's kept and documented.
      db86ec10
    • R
      revert mips (32-bit, o32) syscall asm clean-up due to regressions · 972b5fde
      Rich Felker 提交于
      exactly revert commit 604f8d3d which
      was wrong; it caused a major regression on Linux versions prior to
      2.6.36. old kernels did not properly preserve r2 across syscall
      restart, and instead restarted with the instruction right before
      syscall, imposing a contract that the previous instruction must load
      r2 from an immediate or a register (or memory) not clobbered by the
      syscall.
      972b5fde
    • R
      revert mips64/n32 syscall asm clean-up due to regressions · 5053fd26
      Rich Felker 提交于
      effectivly revert commit ddc7c4f9
      which was wrong; it caused a major regression on Linux versions prior
      to 2.6.36. old kernels did not properly preserve r2 across syscall
      restart, and instead restarted with the instruction right before
      syscall, imposing a contract that the previous instruction must load
      r2 from an immediate or a register (or memory) not clobbered by the
      syscall.
      
      since other changes were made since, including removal of the struct
      stat conversion that was replaced by separate struct kstat, this is
      not a direct revert, only a functional one.
      
      the "0"(r2) input constraint added back seems useless/erroneous, but
      without it most gcc versions (seems to be all prior to 9.x) fail to
      honor the output register binding for r2. this seems to be a variant
      of gcc bug #87733. further changes should be made later if a better
      workaround is found, but this one has been working since 2012. it
      seems this issue was encountered but misidentified then, when it
      inspired commit 4221f154.
      5053fd26
  6. 05 3月, 2020 1 次提交
  7. 26 2月, 2020 1 次提交
    • R
      add PTHREAD_NULL · 4e0796df
      Rich Felker 提交于
      this is added for POSIX-future as the outcome of Austin Group issue
      599. since it's in the reserved namespace for pthread.h, there are no
      namespace considerations for adding it early.
      4e0796df
  8. 23 2月, 2020 1 次提交
    • R
      use __socketcall to simplify socket() · 7063c459
      Rich Felker 提交于
      commit 59324c8b added __socketcall
      analogous to __syscall, returning the negated error rather than
      setting errno. use it to simplify the fallback path of socket(),
      avoiding extern calls and access to errno.
      
      Author: Rich Felker <dalias@aerifal.cx>
      Date:   Tue Jul 30 17:51:16 2019 -0400
      
          make __socketcall analogous to __syscall, error-returning
      7063c459
  9. 22 2月, 2020 3 次提交
    • R
      remove wrap_write helper from vdprintf · a01f1fe6
      Rich Felker 提交于
      this reverts commit 4ee039f3, which
      added the helper as a hack to make vdprintf usable before relocation,
      contingent on strong assumptions about the arch and tooling, back when
      the dynamic linker did not have a real staged model for
      self-relocation. since commit f3ddd173
      this has been unnecessary and the function was just wasting size and
      execution time.
      a01f1fe6
    • S
      math: fix sinh overflows in non-nearest rounding · d2055814
      Szabolcs Nagy 提交于
      The final rounding operation should be done with the correct sign
      otherwise huge results may incorrectly get rounded to or away from
      infinity in upward or downward rounding modes.
      
      This affected sinh and sinhf which set the sign on the result after
      a potentially overflowing mul. There may be other non-nearest rounding
      issues, but this was a known long standing issue with large ulp error
      (depending on how ulp is defined near infinity).
      
      The fix should have no effect on sinh and sinhf performance but may
      have a tiny effect on cosh and coshf.
      d2055814
    • S
      math: fix __rem_pio2 in non-nearest rounding modes · b3797d3b
      Szabolcs Nagy 提交于
      Handle when after reduction |y| > pi/4+tiny. This happens in directed
      rounding modes because the fast round to int code does not give the
      nearest integer. In such cases the reduction may not be symmetric
      between x and -x so e.g. cos(x)==cos(-x) may not hold (but polynomial
      evaluation is not symmetric either with directed rounding so fixing
      that would require more changes with bigger performance impact).
      
      The fix only adds two predictable branches in nearest rounding mode,
      simple ubenchmark does not show relevant performance regression in
      nearest rounding mode.
      
      The code could be improved: e.g reducing the medium size threshold
      such that two step reduction is enough instead of three, and the
      single precision case can avoid the issue by doing the round to int
      differently, but this fix was kept minimal.
      b3797d3b
  10. 21 2月, 2020 1 次提交
  11. 13 2月, 2020 1 次提交
    • R
      fix remaining direct use of stat syscalls outside fstatat.c · c9ebff47
      Rich Felker 提交于
      because struct stat is no longer assumed to correspond to the
      structure used by the stat-family syscalls, it's not valid to make any
      of these syscalls directly using a buffer of type struct stat.
      
      commit 94938920 moved all logic around
      this change for stat-family functions into fstatat.c, making the
      others wrappers for it. but a few other direct uses of the syscall
      were overlooked. the ones in tmpnam/tempnam are harmless since the
      syscalls are just used to test for file existence. however, the uses
      in fchmodat and __map_file depend on getting accurate file properties,
      and these functions may actually have been broken one or more mips
      variants due to removal of conversion hacks from syscall_arch.h.
      
      as a low-risk fix, simply use struct kstat in place of struct stat in
      the affected places.
      c9ebff47
  12. 07 2月, 2020 5 次提交
  13. 05 2月, 2020 2 次提交