1. 14 9月, 2019 2 次提交
    • R
      harden thread start with failed scheduling against broken __clone · f5eee489
      Rich Felker 提交于
      commit 8a544ee3 introduced a
      dependency of the failure path for explicit scheduling at thread
      creation on __clone's handling of the start function returning, which
      should result in SYS_exit.
      
      as noted in commit 05870abe, the arm
      version of __clone was broken in this case. in the past, the mips
      version was also broken; it was fixed in commit
      8b2b61e0.
      
      since this code path is pretty much entirely untested (previously only
      reachable in applications that call the public clone() and return from
      the start function) and consists of fragile per-arch asm, don't assume
      it works, at least not until it's been thoroughly tested. instead make
      the SYS_exit syscall from the start function's failure path.
      f5eee489
    • B
      fix %lf in wprintf · f7e464bf
      Brion Vibber 提交于
      commit cc3a4466 fixed this for printf
      but neglected to fix wprintf.
      
      Previously, %lf caused a failure to output.
      f7e464bf
  2. 12 9月, 2019 3 次提交
    • R
      fix arm __tlsdesc_dynamic when built as thumb code without __ARM_ARCH>=5 · 1ef37aa0
      Rich Felker 提交于
      we don't actually support building asm source files as thumb1, but
      it's possible that the condition __ARM_ARCH>=5 would be false on old
      compilers that did not define __ARM_ARCH at all. avoiding that would
      require enumerating all of the possible __ARM_ARCH_*__ macros for
      testing.
      
      as noted in commit 05870abe, mov lr,pc
      is not valid for saving a return address when in thumb mode. since
      this code is a hot path (dynamic TLS access), don't do the out-of-line
      bl->bx chaining to save the return value; instead, use the fact that
      this file is preprocessed asm to add the missing thumb bit with an add
      in place of the mov.
      
      the change here does not affect builds for ISA levels new enough to
      have a thread pointer read instruction, or for armv5 and later as long
      as the compiler properly defines __ARM_ARCH, or for any build as arm
      (not thumb) code. it's likely that it makes no difference whatsoever
      to any present-day practical build environments, but nonetheless now
      it's safe.
      
      as an alternative, we could just assume __thumb__ implies availability
      of blx since we don't support building asm source files as thumb1. I
      didn't do that in order to avoid having a wrong assumption here if
      that ever changes.
      1ef37aa0
    • R
      fix arm __a_barrier_oldkuser when built as thumb · b0301f47
      Rich Felker 提交于
      as noted in commit 05870abe, mov lr,pc
      is not a valid method for saving the return address in code that might
      be built as thumb.
      
      this one is unlikely to matter, since any ISA level that has thumb2
      should also have native implementations of atomics that don't involve
      kuser_helper, and the affected code is only used on very old kernels
      to begin with.
      b0301f47
    • R
      fix code path where child function returns in arm __clone built as thumb · 05870abe
      Rich Felker 提交于
      mov lr,pc is not a valid way to save the return address in thumb mode
      since it omits the thumb bit. use a chain of bl and bx to emulate blx.
      this could be avoided by converting to a .S file with preprocessor
      conditions to use blx if available, but the time cost here is
      dominated by the syscall anyway.
      
      while making this change, also remove the remnants of support for
      pre-bx ISA levels. commit 9f290a49
      removed the hack from the parent code paths, but left the unnecessary
      code in the child. keeping it would require rewriting two code paths
      rather than one, and is useless for reasons described in that commit.
      05870abe
  3. 11 9月, 2019 6 次提交
    • S
      aarch64: add HWCAP2 flags from linux v5.2 · 9920bf45
      Szabolcs Nagy 提交于
      AT_HWCAP2 flags, see
      
        linux commit 671db581815faf17cbedd7fcbc48823a247d90b1
        arm64: Expose DC CVADP to userspace
      
        linux commit 06a916feca2b262ab0c1a2aeb68882f4b1108a07
        arm64: Expose SVE2 features for userspace
      9920bf45
    • S
      add new syscall numbers from linux v5.2 · b6076309
      Szabolcs Nagy 提交于
      new mount api syscalls were added, same numers on all targets, see
      
        linux commit a07b20004793d8926f78d63eb5980559f7813404
        vfs: syscall: Add open_tree(2) to reference or clone a mount
      
        linux commit 2db154b3ea8e14b04fee23e3fdfd5e9d17fbc6ae
        vfs: syscall: Add move_mount(2) to move mounts around
      
        linux commit 24dcb3d90a1f67fe08c68a004af37df059d74005
        vfs: syscall: Add fsopen() to prepare for superblock creation
      
        linux commit ecdab150fddb42fe6a739335257949220033b782
        vfs: syscall: Add fsconfig() for configuring and managing a context
      
        linux commit 93766fbd2696c2c4453dd8e1070977e9cd4e6b6d
        vfs: syscall: Add fsmount() to create a mount for a superblock
      
        linux commit cf3cba4a429be43e5527a3f78859b1bfd9ebc5fb
        vfs: syscall: Add fspick() to select a superblock for reconfiguration
      
        linux commit 9c8ad7a2ff0bfe58f019ec0abc1fb965114dde7d
        uapi, x86: Fix the syscall numbering of the mount API syscalls [ver #2]
      
        linux commit d8076bdb56af5e5918376cd1573a6b0007fc1a89
        uapi: Wire up the mount API syscalls on non-x86 arches [ver #2]
      b6076309
    • S
      fcntl.h: add AT_RECURSIVE from linux v5.2 · 81e795e1
      Szabolcs Nagy 提交于
      apply open_tree with OPEN_TREE_CLONE call to the entire subtree, see
      
        linux commit a07b20004793d8926f78d63eb5980559f7813404
        vfs: syscall: Add open_tree(2) to reference or clone a mount
      81e795e1
    • S
      fcntl.h: add AT_STATX_ statx sync flag definitions · cc1a5351
      Szabolcs Nagy 提交于
      see
      
        linux commit a528d35e8bfcc521d7cb70aaf03e1bd296c8493f
        statx: Add a system call to make enhanced file info available
      
      these are linux specific and not reserved names for fcntl.h so they
      are under _BSD_SOURCE|_GNU_SOURCE.
      cc1a5351
    • S
      sched.h: add CLONE_PIDFD from linux v5.2 · 1e22eb2e
      Szabolcs Nagy 提交于
      when set a pidfd is stored in parent_tidptr, see
      
        linux commit b3e5838252665ee4cfa76b82bdf1198dca81e5be
        clone: add CLONE_PIDFD
      1e22eb2e
    • S
      netinet/if_ether.h: add ETH_P_DSA_8021Q from linux v5.2 · b5134ccd
      Szabolcs Nagy 提交于
      ethertype for fake VLAN header for DSA, see
      
        linux commit bf5bc3ce8a8f32a0d45b6820ede8f9fc3e9c23df
        ether: Add dedicated Ethertype for pseudo-802.1Q DSA tagging
      b5134ccd
  4. 09 9月, 2019 1 次提交
    • R
      honor __WCHAR_TYPE__ on archs with legacy long definition of wchar_t · 1f0e9f9c
      Rich Felker 提交于
      historically, a number of 32-bit archs used long rather than int for
      wchar_t, for no good reason. GCC still uses the historical types, but
      clang replaced them all with int, and it seems PCC uses int too.
      mismatching the compiler's type for wchar_t is not an option due to
      wide string literals.
      
      note that the mismatch does not affect C++ ABI since wchar_t is its
      own builtin type/keyword in C++, distinct from both int and long, not
      a typedef.
      
      i386 already worked around this by honoring __WCHAR_TYPE__ if defined
      by the compiler, and only using the official legacy ABI type if not.
      add the same to the other affected archs.
      
      it might make sense at some point to switch to using int as the
      default if __WCHAR_TYPE__ is not defined, if the expectations is that
      new compilers will treat int as the correct choice, but it's unlikely
      that the case where __WCHAR_TYPE__ is undefined will ever be used
      anyway. I actually wanted to move the definition of wchar_t to the
      top-level shared alltypes.h.in, using __WCHAR_TYPE__ and falling back
      to int if not defined, but that can't be done without assuming all
      compilers define __WCHAR_TYPE__ thanks to some pathological archs
      where the ABI has wchar_t as an unsigned type.
      1f0e9f9c
  5. 07 9月, 2019 3 次提交
    • R
      synchronously clean up pthread_create failure due to scheduling errors · 8a544ee3
      Rich Felker 提交于
      previously, when pthread_create failed due to inability to set
      explicit scheduling according to the requested attributes, the nascent
      thread was detached and made responsible for its own cleanup via the
      standard pthread_exit code path. this left it consuming resources
      potentially well after pthread_create returned, in a way that the
      application could not see or mitigate, and unnecessarily exposed its
      existence to the rest of the implementation via the global thread
      list.
      
      instead, attempt explicit scheduling early and reuse the failure path
      for __clone failure if it fails. the nascent thread's exit futex is
      not needed for unlocking the thread list, since the thread calling
      pthread_create holds the thread list lock the whole time, so it can be
      repurposed to ensure the thread has finished exiting. no pthread_exit
      is needed, and freeing the stack, if needed, can happen just as it
      would if __clone failed.
      8a544ee3
    • R
      set explicit scheduling for new thread from calling thread, not self · 022f27d5
      Rich Felker 提交于
      if setting scheduling properties succeeds, the new thread may end up
      with lower priority than the caller, and may be unable to continue
      running due to another intermediate-priority thread. this produces a
      priority inversion situation for the thread calling pthread_create,
      since it cannot return until the new thread reports success.
      
      originally, the parent was responsible for setting the new thread's
      priority; commits b8742f32 and
      40bae2d3 changed it as part of
      trimming down the pthread structure. since then, commit
      04335d92 partly reversed the changes,
      but did not switch responsibilities back. do that now.
      022f27d5
    • R
      fix unsynchronized decrement of thread count on pthread_create error · dd0a23dd
      Rich Felker 提交于
      commit 8f11e612 wrongly documented
      that all changes to libc.threads_minus_1 were guarded by the thread
      list lock, but the decrement for failed SYS_clone took place after the
      thread list lock was released.
      dd0a23dd
  6. 31 8月, 2019 2 次提交
    • R
      add public declaration for optreset under appropriate feature profiles · a882841b
      Rich Felker 提交于
      commit 030e5263 added optreset, a BSD
      extension to getopt duplicating the functionality (also an extension)
      of setting optind to 0, but failed to provide a public declaration for
      it. according to the BSD documentation and headers, the application is
      not supposed to need to provide its own declaration.
      a882841b
    • R
      add posix_spawn [f]chdir file actions · 74244e5b
      Rich Felker 提交于
      these are presently extensions, thus named with _np to match glibc and
      other implementations that provide them; however they are likely to be
      standardized in the future without the _np suffix as a result of
      Austin Group issue 1208. if so, both names will be kept as aliases.
      74244e5b
  7. 24 8月, 2019 1 次提交
  8. 19 8月, 2019 1 次提交
    • R
      fix clash between sys/user.h and kernel ptrace.h on powerpc[64], sh · 6ad514e4
      Rich Felker 提交于
      due to historical accident/sloppiness in glibc, the powerpc,
      powerpc64, and sh versions of struct user, defined by sys/user.h, used
      struct pt_regs from the kernel asm/ptrace.h for their regs member.
      this made it impossible to define the type in an API-compatible manner
      without either including asm/ptrace.h like glibc does (contrary to our
      policy of not depending on kernel headers), or clashing with
      asm/ptrace.h's definition of struct pt_regs if both headers are
      included (which is almost always the case in software using
      sys/user.h).
      
      for a long time I viewed this problem as having no reasonable fix. I
      even explored the possibility of having the powerpc[64] and sh
      versions of user.h just include the kernel header (breaking with
      policy), but that looked like it might introduce new clashes with
      sys/ptrace.h. and it would also bring in a lot of additional cruft
      that makes no sense for sys/user.h to expose. glibc goes out of its
      way to suppress some of that with #undef, possibly leading to
      different problems. this is a rabbit-hole that should be explored no
      further.
      
      as it turns out, however, nothing actually uses struct user
      sufficiently to care about the type of the regs member; most software
      including sys/user.h does not even use struct user at all. so, the
      problem can be fixed just by doing away with the insistence on strict
      glibc API compatibility for the struct tag of the regs member.
      
      rather than renaming the tag, which might lead to the new name
      entering use as API, simply use an untagged structure inside struct
      user with the same members/layout as struct pt_regs.
      
      for sh, struct pt_dspregs is just removed entirely since it was not
      used.
      6ad514e4
  9. 18 8月, 2019 1 次提交
  10. 15 8月, 2019 1 次提交
    • R
      remove sporadic server members from struct sched_param · 827aa8fb
      Rich Felker 提交于
      these members are associated with an unsupported option group. with
      time_t changing size on 32-bit archs, all interfaces taking struct
      sched_param arguments would need redirection and compat shims in order
      to be able to continue offering these members, for no benefit. just
      convert them to reserved space instead.
      827aa8fb
  11. 14 8月, 2019 2 次提交
    • K
      re-add ELF gregs and fpregs types to riscv64 user.h · 29e8737f
      Khem Raj 提交于
      d493206d deleted all the content of
      user.h, but sys/procfs.h expects this from sys/user.h
      threfore we retain the non conflicting parts
      29e8737f
    • R
      fix regression whereby main thread didn't get TLS relocations · 9d35fec9
      Rich Felker 提交于
      commit ffab4360 broke this by moving
      relocations after not only the allocation of storage for the main
      thread's static TLS, but after the copying of the TLS image. thus,
      relocation results were not reflected in the main thread's copy. this
      could be fixed by calling __reset_tls after relocations, but instead
      split the allocation and installation before/after relocations so that
      there's not a redundant copy.
      
      due to commit 71af5309, updating of
      static_tls_cnt needs to be kept with allocation of static TLS, before
      relocations, rather than after installation.
      9d35fec9
  12. 13 8月, 2019 3 次提交
    • R
      fix accidentlly-external cmp symbol introduced with catgets · b19fa247
      Rich Felker 提交于
      commit 7590203c omitted static here.
      b19fa247
    • S
      make relocation time symbol lookup and dlsym consistent · f2435263
      Szabolcs Nagy 提交于
      Using common code path for all symbol lookups fixes three dlsym issues:
      
      - st_shndx of STT_TLS symbols were not checked and thus an undefined
        tls symbol reference could be incorrectly treated as a definition
        (the sysv hash lookup returns undefined symbols, gnu does not, so should
        be rare in practice).
      
      - symbol binding was not checked so a hidden symbol may be returned
        (in principle STB_LOCAL symbols may appear in the dynamic symbol table
        for hidden symbols, but linkers most likely don't produce it).
      
      - mips specific behaviour was not applied (ARCH_SYM_REJECT_UND) so
        undefined symbols may be returned on mips.
      
      always_inline is used to avoid relocation performance regression, the
      code generation for find_sym should not be affected.
      f2435263
    • R
      ldso: correct condition for local symbol handling in do_relocs · 1f060ed2
      Rich Felker 提交于
      commit 7a9669e9 added use of the
      symbol reference as the definition, in place of performing a lookup,
      for STT_SECTION symbol references that were first found used in FDPIC.
      such references may happen in certain other cases, such as
      local-dynamic TLS and with relocation types that require a symbol but
      that are being used for non-symbolic purposes, like the powerpc
      unaligned address relocations.
      
      in all such cases I'm aware of, the symbol referenced is a section
      symbol (STT_SECTION); however, the important semantic property is not
      its being a section, but rather its binding local (STB_LOCAL). check
      the latter instead of the former for greater generality and semantic
      correctness.
      1f060ed2
  13. 12 8月, 2019 1 次提交
    • S
      add support for powerpc/powerpc64 unaligned relocations · 08869deb
      Samuel Holland 提交于
      R_PPC_UADDR32 (R_PPC64_UADDR64) has the same meaning as R_PPC_ADDR32
      (R_PPC64_ADDR64), except that its address need not be aligned. For
      powerpc64, BFD ld(1) will automatically convert between ADDR<->UADDR
      relocations when the address is/isn't at its native alignment. This
      will happen if, for example, there is a pointer in a packed struct.
      
      gold and lld do not currently generate R_PPC64_UADDR64, but pass
      through misaligned R_PPC64_ADDR64 relocations from object files,
      possibly relaxing them to misaligned R_PPC64_RELATIVE. In both cases
      (relaxed or not) this violates the PSABI, which defines the relevant
      field type as "a 64-bit field occupying 8 bytes, the alignment of
      which is 8 bytes unless otherwise specified."
      
      All three linkers violate the PSABI on 32-bit powerpc, where the only
      difference is that the field is 32 bits wide, aligned to 4 bytes.
      
      Currently musl fails to load executables linked by BFD ld containing
      R_PPC64_UADDR64, with the error "unsupported relocation type 43".
      This change provides compatibility with BFD ld on powerpc64, and any
      static linker on either architecture that starts following the PSABI
      more closely.
      08869deb
  14. 11 8月, 2019 2 次提交
    • R
      ldso: remove redundant runtime checks in static TLS logic · 71af5309
      Rich Felker 提交于
      as a result of commit ffab4360,
      static_tls_cnt is now valid during relocations at program startup, so
      it's no longer necessary to condition the check against static_tls_cnt
      on this being a runtime (dlopen) relocation.
      71af5309
    • R
      ldso: fix calloc misuse allocating initial tls · ffab4360
      Rich Felker 提交于
      this is analogous to commit 2f1f51ae,
      and should have been caught at the same time since it was right next
      to the code moved in that commit. between final stage 3 reloc_all and
      the jump to the main program's entry point, it is not valid to call
      any functions which may be interposed by the application; doing so
      results in execution of application code before ctors have run, and on
      fdpic archs, before the main program's fdpic self-fixups have taken
      place, which will produce runaway wrong execution.
      ffab4360
  15. 08 8月, 2019 5 次提交
  16. 07 8月, 2019 6 次提交
    • R
      fix regression in select with no timeout · d0b547df
      Rich Felker 提交于
      commit 722a1ae3 inadvertently passed a
      copy of {s,us} to the syscall even if the timeout argument tv was
      null, thereby causing immediate timeout (polling) in place of
      unlimited timeout. only archs using SYS_select were affected.
      d0b547df
    • R
      fix failure of glob to match broken symlinks under some conditions · e408deef
      Rich Felker 提交于
      when the pattern ended with one or more literal path components, or
      when the GLOB_MARK flag was passed to request that glob flag directory
      results and the type obtained by readdir was unknown or inconclusive
      (symlink), the stat function was called to evaluate existence and/or
      determine type. however, stat fails with ENOENT for broken symlinks,
      and this caused the match to be omitted from the results.
      
      instead, use stat only for the unknown/inconclusive cases with
      GLOB_MARK, and otherwise, or if stat fails, use lstat existence still
      needs to be determined. this minimizes the number of costly syscalls,
      performing both only in the case where GLOB_MARK is in use and there
      is a final literal path component which is a broken symlink.
      
      based on/simplified from patch by James Y Knight.
      e408deef
    • R
      remove riscv64 bits/user.h contents · d493206d
      Rich Felker 提交于
      the contents conflicted with asm/ptrace.h. glibc does not provide
      anything in user.h for riscv, so software cannot be depending on it.
      
      simplified from patch submitted by Baruch Siach.
      d493206d
    • B
      fix risc64 conflict with kernel headers · 8acc6885
      Baruch Siach 提交于
      Rename user registers struct definitions to avoid conflict with the
      asm/ptrace.h kernel header that defines the same structs. Use the
      __riscv_mc prefix as glibc does.
      8acc6885
    • P
      in arm cancellation point asm, don't unnecessarily preserve link register · e0e8ae75
      Patrick Oppenlander 提交于
      The only reason we needed to preserve the link register was because we
      were using a branch-link instruction to branch to __cp_cancel.
      Replacing this with a branch means we can avoid the save/restore as
      the link register is no longer modified.
      e0e8ae75
    • I
      glob: implement GLOB_TILDE and GLOB_TILDE_CHECK · 49eacf29
      Ismael Luceno 提交于
      49eacf29