1. 28 7月, 2018 1 次提交
    • R
      make pthread_attr_init honor defaults set by pthread_setattr_default_np · 14992d43
      Rich Felker 提交于
      this fixes a major gap in the intended functionality of
      pthread_setattr_default_np. if application/library code creating a
      thread does not pass a null attribute pointer to pthread_create, but
      sets up an attribute object to change other properties while leaving
      the stack alone, the created thread will get a stack with size
      DEFAULT_STACK_SIZE. this makes pthread_setattr_default_np useless for
      working around stack overflow issues in such applications, and leaves
      a major risk of regression if previously-working code switches from
      using a null attribute pointer to an attribute object.
      
      this change aligns the behavior more closely with the glibc
      pthread_setattr_default_np functionality too, albeit via a different
      mechanism. glibc encodes "default" specially in the attribute object
      and reads the actual default at thread creation time. with this
      commit, we now copy the current default into the attribute object at
      pthread_attr_init time, so that applications that query the properties
      of the attribute object will see the right values.
      14992d43
  2. 24 7月, 2018 1 次提交
    • F
      bsearch: simplify and optimize · 3d8322c7
      Fangrui Song 提交于
      maintainer's note: the key observation here is that the compared
      element is the first slot of the second ceil(half) of the array, and
      thus can be removed for further comparison when it does not match, so
      that we descend into the second ceil(half)-1 rather than ceil(half)
      elements. this change ensures that nel strictly decreases with each
      iteration, so that the case of != but nel==1 does not need to be
      special-cased anymore.
      3d8322c7
  3. 19 7月, 2018 2 次提交
  4. 15 7月, 2018 1 次提交
    • R
      implement getaddrinfo's AI_ADDRCONFIG flag · 187bcc3b
      Rich Felker 提交于
      this flag is notoriously under-/mis-specified, and in the past it was
      implemented as a nop, essentially considering the absence of a
      loopback interface with 127.0.0.1 and ::1 addresses an unsupported
      configuration. however, common real-world container environments omit
      IPv6 support (even for the network-namespaced loopback interface), and
      some kernels omit IPv6 support entirely. future systems on the other
      hand might omit IPv4 entirely.
      
      treat these as supported configurations and suppress results of the
      unconfigured/unsupported address families when AI_ADDRCONFIG is
      requested. use routability of the loopback address to make the
      determination; unlike other implementations, we do not exclude
      loopback from the "an address is configured" condition, since there is
      no basis in the specification for such exclusion. obtaining a result
      with AI_ADDRCONFIG does not imply routability of the result, and
      applications must still be able to cope with unroutable results even
      if they pass AI_ADDRCONFIG.
      187bcc3b
  5. 14 7月, 2018 1 次提交
    • R
      fix writes outside buffer by ungetc after setvbuf · 9cad27a3
      Rich Felker 提交于
      commit 0b80a7b0, which added non-stub
      setvbuf, applied the UNGET pushback adjustment to the size of the
      buffer passed in, but inadvertently omitted offsetting the start by
      the same amount, thereby allowing unget to clobber up to 8 bytes
      before the start of the buffer. this bug was introduced in the present
      release cycle; no releases are affected.
      9cad27a3
  6. 12 7月, 2018 1 次提交
    • R
      resolver: don't depend on v4mapped ipv6 to probe routability of v4 addrs · 4f35eb75
      Rich Felker 提交于
      to produce sorted results roughly corresponding to RFC 3484/6724,
      __lookup_name computes routability and choice of source address via
      dummy UDP connect operations (which do not produce any packets). since
      at the logical level, the properties fed into the sort key are
      computed on ipv6 addresses, the code was written to use the v4mapped
      ipv6 form of ipv4 addresses and share a common code path for them all.
      however, on kernels where ipv6 support has been completely omitted,
      this causes ipv4 to appear equally unroutable as ipv6, thereby putting
      unreachable ipv6 addresses before ipv4 addresses in the results.
      
      instead, use only ipv4 sockets to compute routability for ipv4
      addresses. some gratuitous conversion back and forth is left so that
      the logic is not affected by these changes. it may be possible to
      simplify the ipv4 case considerably, thereby reducing code size and
      complexity.
      4f35eb75
  7. 03 7月, 2018 1 次提交
  8. 27 6月, 2018 5 次提交
    • P
    • D
      add explicit_bzero implementation · 05ac345f
      David Carlier 提交于
      maintainer's note: past sentiment was that, despite being imperfect
      and unable to force clearing of all possible copies of sensitive data
      (e.g. in registers, register spills, signal contexts left on the
      stack, etc.) this function would be added if major implementations
      agreed on it, which has happened -- several BSDs and glibc all include
      it.
      05ac345f
    • A
      inet_ntop: do not compress single zeros in IPv6 · 5c8e6926
      Arthur Jones 提交于
      maintainer's note: this change is for conformance with RFC 5952,
      4.2.2, which explicitly forbids use of :: to shorten a single 16-bit 0
      field when producing the canonical text representation for an IPv6
      address. fixes a test failure reported by Philip Homburg, who also
      submitted a patch, but this fix is simpler and should produce smaller
      code.
      5c8e6926
    • D
      strftime: fix underlying format string in %z format · da5851e9
      Daniel Sabogal 提交于
      the expression (tm->__tm_gmtoff)/3600 has type long. use %+.2ld instead.
      da5851e9
    • R
      resolver: omit final dot (root/suppress-search) in canonical name · 63e2e40e
      Rich Felker 提交于
      if a final dot was included in the queried host name to anchor it to
      the dns root/suppress search domains, and the result was not a CNAME,
      the returned canonical name included the final dot. this was not
      consistent with other implementations, confused some applications, and
      does not seem desirable.
      
      POSIX specifies returning a pointer to, or to a copy of, the input
      nodename, when the canonical name is not available, but does not
      attempt to specify what constitutes "not available". in the case of
      search, we already have an implementation-defined "availability" of a
      canonical name as the fully-qualified name resulting from search, so
      defining it similarly in the no-search case seems reasonable in
      addition to being consistent with other implementations.
      
      as a bonus, fix the case where more than one trailing dot is included,
      since otherwise the changes made here would wrongly cause lookups with
      two trailing dots to succeed. previously this case resulted in
      malformed dns queries and produced EAI_AGAIN after a timeout. now it
      fails immediately with EAI_NONAME.
      63e2e40e
  9. 21 6月, 2018 2 次提交
    • S
      add memfd_create syscall wrapper · 38f2fa3d
      Szabolcs Nagy 提交于
      memfd_create was added in linux v3.17 and glibc has api for it.
      38f2fa3d
    • S
      add mlock2 linux syscall wrapper · b64d66d0
      Szabolcs Nagy 提交于
      mlock2 syscall was added in linux v4.4 and glibc has api for it.
      It falls back to mlock in case of flags==0, so that case works
      even on older kernels.
      
      MLOCK_ONFAULT is moved under _GNU_SOURCE following glibc.
      b64d66d0
  10. 20 6月, 2018 2 次提交
    • R
      work around broken kernel struct ipc_perm on some big endian archs · 0cd2be23
      Rich Felker 提交于
      the mode member of struct ipc_perm is specified by POSIX to have type
      mode_t, which is uniformly defined as unsigned int. however, Linux
      defines it with type __kernel_mode_t, and defines __kernel_mode_t as
      unsigned short on some archs. since there is a subsequent padding
      field, treating it as a 32-bit unsigned int works on little endian
      archs, but the order is backwards on big endian archs with the
      erroneous definition.
      
      since multiple archs are affected, remedy the situation with fixup
      code in the affected functions (shmctl, semctl, and msgctl) rather
      than repeating the same shims in syscall_arch.h for every affected
      arch.
      0cd2be23
    • R
      add m68k port · f81e44a0
      Rich Felker 提交于
      three ABIs are supported: the default with 68881 80-bit fpu format and
      results returned in floating point registers, softfloat-only with the
      same format, and coldfire fpu with IEEE single/double only. only the
      first is tested at all, and only under qemu which has fpu emulation
      bugs.
      
      basic functionality smoke tests have been performed for the most
      common arch-specific breakage via libc-test and qemu user-level
      emulation. some sysvipc failures remain, but are shared with other big
      endian archs and will be fixed separately.
      f81e44a0
  11. 15 6月, 2018 1 次提交
    • R
      add support for m68k 80-bit long double variant · 18f02c42
      Rich Felker 提交于
      since x86 and m68k are the only archs with 80-bit long double and each
      has mandatory endianness, select the variant via endianness.
      differences are minor: apparently just byte order and representation
      of infinities. the m68k format is not well-documented anywhere I could
      find, so if other differences are found they may require additional
      changes later.
      18f02c42
  12. 03 6月, 2018 1 次提交
    • S
      fix TLS layout of TLS variant I when there is a gap above TP · 610c5a85
      Szabolcs Nagy 提交于
      In TLS variant I the TLS is above TP (or above a fixed offset from TP)
      but on some targets there is a reserved gap above TP before TLS starts.
      
      This matters for the local-exec tls access model when the offsets of
      TLS variables from the TP are hard coded by the linker into the
      executable, so the libc must compute these offsets the same way as the
      linker.  The tls offset of the main module has to be
      
      	alignup(GAP_ABOVE_TP, main_tls_align).
      
      If there is no TLS in the main module then the gap can be ignored
      since musl does not use it and the tls access models of shared
      libraries are not affected.
      
      The previous setup only worked if (tls_align & -GAP_ABOVE_TP) == 0
      (i.e. TLS did not require large alignment) because the gap was
      treated as a fixed offset from TP.  Now the TP points at the end
      of the pthread struct (which is aligned) and there is a gap above
      it (which may also need alignment).
      
      The fix required changing TP_ADJ and __pthread_self on affected
      targets (aarch64, arm and sh) and in the tlsdesc asm the offset to
      access the dtv changed too.
      610c5a85
  13. 02 6月, 2018 2 次提交
    • R
      fix output size handling for multi-unicode-char big5-hkscs characters · 029c622a
      Rich Felker 提交于
      since this iconv implementation's output is stateless, it's necessary
      to know before writing anything to the output buffer whether the
      conversion of the current input character will fit.
      
      previously we used a hard-coded table of the output size needed for
      each supported output encoding, but failed to update the table when
      adding support for conversion to jis-based encodings and again when
      adding separate encoding identifiers for implicit-endianness utf-16/32
      and ucs-2/4 variants, resulting in out-of-bound table reads and
      incorrect size checks. no buffer overflow was possible, but the
      affected characters could be converted incorrectly, and iconv could
      potentially produce an incorrect return value as a result.
      
      remove the hard-coded table, and instead perform the recursive iconv
      conversion to a temporary buffer, measuring the output size and
      transferring it to the actual output buffer only if the whole
      converted result fits.
      029c622a
    • R
      fix iconv mapping of big5-hkscs characters that map to two unicode chars · 165a1e37
      Rich Felker 提交于
      this case is handled with a recursive call to iconv using a
      specially-constructed conversion descriptor. the constant 0 was used
      as the offset for utf-8, since utf-8 appears first in the charmaps
      table, but the offset used needs to point into the charmap entry, past
      the name/aliases at the beginning, to the byte identifying the
      encoding. as a result of this error, junk was produced.
      
      instead, call find_charmap so we don't have to hard-code a nontrivial
      offset. with this change, the code has been tested and found to work
      in the case of converting the affected hkscs characters to utf-8.
      165a1e37
  14. 10 5月, 2018 2 次提交
    • W
      fix iconv conversion to UTF-32 with implicit (big) endianness · 99f4237a
      Will Dietz 提交于
      maintainer's notes:
      
      commit 95c6044e split UTF-32 and
      UTF-32BE but neglected to add a case for the former as a destination
      encoding, resulting in it wrongly being handled by the default case.
      the intent was that the value of the macro be chosen to encode "big
      endian" in the low bits, so that no code would be needed, but this was
      botched; instead, handle it the way UCS2 is handled.
      99f4237a
    • W
      fix iconv buffer overflow converting to legacy JIS-based encodings · 55a661ff
      Will Dietz 提交于
      maintainer's notes:
      
      commit a223dbd2 added the reverse
      conversions to JIS-based encodings, but omitted the check for remining
      buffer space in the case where the next character to be written was
      single-byte, allowing conversion to continue past the end of the
      destination buffer.
      55a661ff
  15. 09 5月, 2018 2 次提交
    • R
      make linking of thread-start with explicit scheduling conditional · 40bae2d3
      Rich Felker 提交于
      the wrapper start function that performs scheduling operations is
      unreachable if pthread_attr_setinheritsched is never called, so move
      it there rather than the pthread_create source file, saving some code
      size for static-linked programs.
      40bae2d3
    • R
      improve design of thread-start with explicit scheduling attributes · b8742f32
      Rich Felker 提交于
      eliminate the awkward startlock mechanism and corresponding fields of
      the pthread structure that were only used at startup.
      
      instead of having pthread_create perform the scheduling operations and
      having the new thread wait for them to be completed, start the new
      thread with a wrapper start function that performs its own scheduling,
      sending the result code back via a futex. this way the new thread can
      use storage from the calling thread's stack rather than permanent
      fields in the pthread structure.
      b8742f32
  16. 08 5月, 2018 1 次提交
    • R
      clean up and reduce size of internal pthread structure · 1db9a355
      Rich Felker 提交于
      over time the pthread structure has accumulated a lot of cruft taking
      up size. this commit removes unused fields and packs booleans and
      other small data more efficiently. changes which would also require
      changing code are not included at this time.
      
      non-volatile booleans are packed as unsigned char bitfield members.
      
      the canceldisable and cancelasync fields need volatile qualification
      due to how they're accessed from the cancellation signal handler and
      cancellable syscalls called from signal handlers. since volatile
      bitfield semantics are not clearly defined, discrete char objects are
      used instead.
      
      the pid field is completely removed; it has been unused since commit
      83dc6eb0.
      
      the tid field's type is changed to int because its use is as a value
      in futexes, which are defined as plain int. it has no conceptual
      relationship to pid_t. also, its position is not ABI.
      
      startlock is reduced to a length-1 array. the second element was
      presumably intended as a waiter count, but it was never used and made
      no sense, since there is at most one waiter.
      1db9a355
  17. 06 5月, 2018 1 次提交
    • R
      improve joinable/detached thread state handling · cdba6b25
      Rich Felker 提交于
      previously, some accesses to the detached state (from pthread_join and
      pthread_getattr_np) were unsynchronized; they were harmless in
      programs with well-defined behavior, but ugly. other accesses (in
      pthread_exit and pthread_detach) were synchronized by a poorly named
      "exitlock", with an ad-hoc trylock operation on it open-coded in
      pthread_detach, whose only purpose was establishing protocol for which
      thread is responsible for deallocation of detached-thread resources.
      
      instead, use an atomic detach_state and unify it with the futex used
      to wait for thread exit. this eliminates 2 members from the pthread
      structure, gets rid of the hackish lock usage, and makes rigorous the
      trap added in commit 80bf5952 for
      catching attempts to join detached threads. it should also make
      attempt to detach an already-detached thread reliably trap.
      cdba6b25
  18. 05 5月, 2018 2 次提交
    • R
      improve pthread_exit synchronization with functions targeting tid · 526e64f5
      Rich Felker 提交于
      if the last thread exited via pthread_exit, the logic that marked it
      dead did not account for the possibility of it targeting itself via
      atexit handlers. for example, an atexit handler calling
      pthread_kill(pthread_self(), SIGKILL) would return success
      (previously, ESRCH) rather than causing termination via the signal.
      
      move the release of killlock after the determination is made whether
      the exiting thread is the last thread. in the case where it's not,
      move the release all the way to the end of the function. this way we
      can clear the tid rather than spending storage on a dedicated
      dead-flag. clearing the tid is also preferable in that it hardens
      against inadvertent use of the value after the thread has terminated
      but before it is joined.
      526e64f5
    • R
      remove incorrect ESRCH error from pthread_kill · 4df42163
      Rich Felker 提交于
      posix documents in the rationale and future directions for
      pthread_kill that, since the lifetime of the thread id for a joinable
      thread lasts until it is joined, ESRCH is not a correct error for
      pthread_kill to produce when the target thread has exited but not yet
      been joined, and that conforming applications cannot attempt to detect
      this state. future versions of the standard may explicitly require
      that ESRCH not be returned for this case.
      4df42163
  19. 03 5月, 2018 1 次提交
    • R
      use a dedicated futex object for pthread_join instead of tid field · 9e2d820a
      Rich Felker 提交于
      the tid field in the pthread structure is not volatile, and really
      shouldn't be, so as not to limit the compiler's ability to reorder,
      merge, or split loads in code paths that may be relevant to
      performance (like controlling lock ownership).
      
      however, use of objects which are not volatile or atomic with futex
      wait is inherently broken, since the compiler is free to transform a
      single load into multiple loads, thereby using a different value for
      the controlling expression of the loop and the value passed to the
      futex syscall, leading the syscall to block instead of returning.
      
      reportedly glibc's pthread_join was actually affected by an equivalent
      issue in glibc on s390.
      
      add a separate, dedicated join_futex object for pthread_join to use.
      9e2d820a
  20. 02 5月, 2018 2 次提交
    • R
      optimize sigisemptyset · 941bd884
      Rich Felker 提交于
      the static const zero set ended up getting put in bss instead of
      rodata, wasting writable memory, and the call to memcmp was
      size-inefficient. generally for nonstandard extension functions we try
      to avoid poking at any internals directly, but the way the zero set
      was setup was arguably already doing so.
      941bd884
    • R
      avoid excessive stack usage in getcwd · 375840c7
      Rich Felker 提交于
      to support the GNU extension of allocating a buffer for getcwd's
      result when a null pointer is passed without incurring a link
      dependency on free, we use a PATH_MAX-sized buffer on the stack and
      only duplicate it to allocated storage after the operation succeeds.
      unfortunately this imposed excessive stack usage on all callers,
      including those not making use of the GNU extension.
      
      instead, use a VLA to make stack allocation conditional.
      375840c7
  21. 27 4月, 2018 1 次提交
    • R
      getopt_long_only: don't prefix-match long-options that match short ones · 9be4ed5d
      Rich Felker 提交于
      for getopt_long, partial (prefix) matches of long options always begin
      with "--" and thus can never be ambiguous with a short option. for
      getopt_long_only, though, a single-character option can match both a
      short option and as a prefix for a long option. in this case, we
      wrongly interpreted it as a prefix for the long option.
      
      introduce a new pass, only in long-only mode, to check the prefix
      match against short options before accepting it. the only reason
      there's a slightly nontrivial loop being introduced rather than strchr
      is that our getopt already supports multibyte short options, and
      getopt_long_long should handle them consistently. a temp buffer and
      strstr could have been used, but the code to set it up would be just
      as large as what's introduced here and it would unnecessarily pull in
      relatively large code for strstr.
      9be4ed5d
  22. 20 4月, 2018 7 次提交
    • R
      reintroduce hardening against partially-replaced allocator · b4b1e103
      Rich Felker 提交于
      commit 618b18c7 removed the previous
      detection and hardening since it was incorrect. commit
      72141795 already handled all that
      remained for hardening the static-linked case. in the dynamic-linked
      case, have the dynamic linker check whether malloc was replaced and
      make that information available.
      
      with these changes, the properties documented in commit
      c9f415d7 are restored: if calloc is
      not provided, it will behave as malloc+memset, and any of the
      memalign-family functions not provided will fail with ENOMEM.
      b4b1e103
    • R
      return chunks split off by memalign using __bin_chunk instead of free · 72141795
      Rich Felker 提交于
      this change serves multiple purposes:
      
      1. it ensures that static linking of memalign-family functions will
      pull in the system malloc implementation, thereby causing link errors
      if an attempt is made to link the system memalign functions with a
      replacement malloc (incomplete allocator replacement).
      
      2. it eliminates calls to free that are unpaired with allocations,
      which are confusing when setting breakpoints or tracing execution.
      
      as a bonus, making __bin_chunk external may discourage aggressive and
      unnecessary inlining of it.
      72141795
    • R
      using malloc implementation types/macros/idioms for memalign · 3c2cbbe7
      Rich Felker 提交于
      the generated code should be mostly unchanged, except for explicit use
      of C_INUSE in place of copying the low bits from existing chunk
      headers/footers.
      
      these changes also remove mild UB due to dubious arithmetic on
      pointers into imaginary size_t[] arrays.
      3c2cbbe7
    • R
      23389b19
    • R
      revert detection of partially-replaced allocator · 618b18c7
      Rich Felker 提交于
      commit c9f415d7 included checks to
      make calloc fallback to memset if used with a replaced malloc that
      didn't also replace calloc, and the memalign family fail if free has
      been replaced. however, the checks gave false positives for
      replacement whenever malloc or free resolved to a PLT entry in the
      main program.
      
      for now, disable the checks so as not to leave libc in a broken state.
      this means that the properties documented in the above commit are no
      longer satisfied; failure to replace calloc and the memalign family
      along with malloc is unsafe if they are ever called.
      
      the calloc checks were correct but useless for static linking. in both
      cases (simple or full malloc), calloc and malloc are in a source file
      together, so replacement of one but not the other would give linking
      errors. the memalign-family check was useful for static linking, but
      broken for dynamic as described above, and can be replaced with a
      better link-time check.
      618b18c7
    • W
      setvbuf: minor comment typo fix · 3f3cc3e9
      Will Dietz 提交于
      3f3cc3e9
    • A
      remove a_ctz_l from arch specific atomic_arch.h · 0c6abb58
      Andre McCurdy 提交于
      Update atomic.h to provide a_ctz_l in all cases (atomic_arch.h should
      now only provide a_ctz_32 and/or a_ctz_64).
      
      The generic version of a_ctz_32 now takes advantage of a_clz_32 if
      available and the generic a_ctz_64 now makes use of a_ctz_32.
      0c6abb58