1. 24 7月, 2014 1 次提交
  2. 21 7月, 2014 5 次提交
  3. 20 7月, 2014 11 次提交
    • R
      fix mips struct stat dev_t members for big endian · f61be1f8
      Rich Felker 提交于
      the mips version of this structure on the kernel side wrongly has
      32-bit type rather than 64-bit type. fortunately there is adjacent
      padding to bring it up to 64 bits, and on little-endian, this allows
      us to treat the adjacent kernel st_dev and st_pad0[0] as as single
      64-bit dev_t. however, on big endian, such treatment results in the
      upper and lower 32-bit parts of the dev_t value being swapped. for the
      purpose of just comparing st_dev values this did not break anything,
      but it precluded actually processing the device numbers as major/minor
      values.
      
      since the broken kernel behavior that needs to be worked around is
      isolated to one arch, I put the workarounds in syscall_arch.h rather
      than adding a stat fixup path in the common code. on little endian
      mips, the added code optimizes out completely.
      
      the changes necessary were incompatible with the way the __asm_syscall
      macro was factored so I just removed it and flattened the individual
      __syscallN functions. this arguably makes the code easier to read and
      understand, anyway.
      f61be1f8
    • B
      add issetugid function to check for elevated privilege · ddddec10
      Brent Cook 提交于
      this function provides a way for third-party library code to use the
      same logic that's used internally in libc for suppressing untrusted
      input/state (e.g. the environment) when the application is running
      with privleges elevated by the setuid or setgid bit or some other
      mechanism. its semantics are intended to match the openbsd function by
      the same name.
      
      there was some question as to whether this function is necessary:
      getauxval(AT_SECURE) was proposed as an alternative. however, this has
      several drawbacks. the most obvious is that it asks programmers to be
      aware of an implementation detail of ELF-based systems (the aux
      vector) rather than simply the semantic predicate to be checked. and
      trying to write a safe, reliable version of issetugid in terms of
      getauxval is difficult. for example, early versions of the glibc
      getauxval did not report ENOENT, which could lead to false negatives
      if AT_SECURE was not present in the aux vector (this could probably
      only happen when running on non-linux kernels under linux emulation,
      since glibc does not support linux versions old enough to lack
      AT_SECURE). as for musl, getauxval has always properly reported
      errors, but prior to commit 7bece9c2,
      the musl implementation did not emulate AT_SECURE if missing, which
      would result in a false positive. since musl actually does partially
      support kernels that lack AT_SECURE, this was problematic.
      
      the intent is that library authors will use issetugid if its
      availability is detected at build time, and only fall back to the
      unreliable alternatives on systems that lack it.
      
      patch by Brent Cook. commit message/rationale by Rich Felker.
      ddddec10
    • R
      fix or1k atomic store · cec33b2c
      Rich Felker 提交于
      at the very least, a compiler barrier is required no matter what, and
      that was missing. current or1k implementations have strong ordering,
      but this is not guaranteed as part of the ISA, so some sort of
      synchronizing operation is necessary.
      
      in principle we should use l.msync, but due to misinterpretation of
      the spec, it was wrongly treated as an optional instruction and is not
      supported by some implementations. if future kernels trap it and treat
      it as a nop (rather than illegal instruction) when the
      hardware/emulator does not support it, we could consider using it.
      
      in the absence of l.msync support, the l.lwa/l.swa instructions, which
      are specified to have a built-in l.msync, need to be used. the easiest
      way to use them to implement atomic store is to perform an atomic swap
      and throw away the result. using compare-and-swap would be lighter,
      and would probably be sufficient for all actual usage cases, but
      checking this is difficult and error-prone:
      
      with store implemented in terms of swap, it's guaranteed that, when
      another atomic operation is performed at the same time as the store,
      either the result of the store followed by the other operation, or
      just the store (clobbering the other operation's result) is seen. if
      store were implemented in terms of cas, there are cases where this
      invariant would fail to hold, and we would need detailed rules for the
      situations in which the store operation is well-defined.
      cec33b2c
    • R
      fix missing barriers in powerpc atomic store · 522a0de2
      Rich Felker 提交于
      522a0de2
    • R
      fix microblaze atomic store · 884cc0c7
      Rich Felker 提交于
      as far as I can tell, microblaze is strongly ordered, but this does
      not seem to be well-documented and the assumption may need revisiting.
      even with strong ordering, however, a volatile C assignment is not
      sufficient to implement atomic store, since it does not preclude
      reordering by the compiler with respect to non-volatile stores and
      loads.
      
      simply flanking a C store with empty volatile asm blocks with memory
      clobbers would achieve the desired result, but is likely to result in
      worse code generation, since the address and value for the store may
      need to be spilled. actually writing the store in asm, so that there's
      only one asm block, should give optimal code generation while
      satisfying the requirement for having a compiler barrier.
      884cc0c7
    • R
      1456b7ae
    • R
      fix missing barrier instructions in mips atomic asm · bcad4843
      Rich Felker 提交于
      previously I had wrongly assumed the ll/sc instructions also provided
      memory synchronization; apparently they do not. this commit adds sync
      instructions before and after each atomic operation and changes the
      atomic store to simply use sync before and after a plain store, rather
      than a useless compare-and-swap.
      bcad4843
    • R
      use memory constraints for mips atomic asm · a294f539
      Rich Felker 提交于
      despite lacking the semantic content that the asm accesses the
      pointed-to object rather than just using its address as a value, the
      mips asm was not actually broken. the asm blocks were declared
      volatile, meaning that the compiler must treat them as having unknown
      side effects.
      
      however changing the asm to use memory constraints is desirable not
      just from a semantic correctness and consistency standpoint, but also
      produces better code. the compiler is able to use base/offset
      addressing expressions for the atomic object's address rather than
      having to load the address into a single register. this improves
      access to global locks in static libc, and access to non-zero-offset
      atomic fields in synchronization primitives, etc.
      a294f539
    • R
      fix build breakage from ppc asm constraints change · bb3a3bef
      Rich Felker 提交于
      due to a mistake in my testing procedure, the changes in the previous
      commit were not correctly tested and wrongly assumed to be valid. the
      lwarx and stwcx. instructions do not accept general ppc memory address
      expressions and thus the argument associated with the memory
      constraint cannot be used directly.
      
      instead, the memory constraint can be left as an argument that the asm
      does not actually use, and the address can be provided in a separate
      register constraint.
      bb3a3bef
    • R
      remove cruft from microblaze atomic.h · 94252dd3
      Rich Felker 提交于
      94252dd3
    • R
      fix broken constraints for powerpc atomic cas asm · 7fdae458
      Rich Felker 提交于
      the register constraint for the address to be accessed did not convey
      that the asm can access the pointed-to object. as far as the compiler
      could tell, the result of the asm was just a pure function of the
      address and the values passed in, and thus the asm could be hoisted
      out of loops or omitted entirely if the result was not used.
      7fdae458
  4. 19 7月, 2014 3 次提交
    • R
      fix missing flags arg to fstatat syscall in fstat fallback path · dc9c40a6
      Rich Felker 提交于
      this code path is used only on archs without the plain, non-at
      syscalls, and only when the fstat syscall fails with EBADF on a valid
      file descriptor. this in turn can happen only for O_PATH file
      descriptors, and may not happen at all on the newer kernels needed for
      supporting such archs.
      
      with the flags argument omitted, spurious fstat failures may happen
      when the argument register happens to have the AT_SYMLINK_NOFOLLOW bit
      set.
      dc9c40a6
    • R
      fix microblaze definition of struct stat · d69ab5b3
      Rich Felker 提交于
      the erroneous definition was missed because with works with qemu
      user-level emulation, which also has the wrong definition. the actual
      kernel uses the asm-generic generic definition.
      d69ab5b3
    • S
      add or1k (OpenRISC 1000) architecture port · 200d1547
      Stefan Kristiansson 提交于
      With the exception of a fenv implementation, the port is fully featured.
      The port has been tested in or1ksim, the golden reference functional
      simulator for OpenRISC 1000.
      It passes all libc-test tests (except the math tests that
      requires a fenv implementation).
      
      The port assumes an or1k implementation that has support for
      atomic instructions (l.lwa/l.swa).
      
      Although it passes all the libc-test tests, the port is still
      in an experimental state, and has yet experienced very little
      'real-world' use.
      200d1547
  5. 18 7月, 2014 3 次提交
    • R
      provide getauxval(AT_SECURE) even if it is missing from the aux vector · 7bece9c2
      Rich Felker 提交于
      this could happen on 2.4-series linux kernels that predate AT_SECURE
      and possibly on other kernels that are emulating the linux syscall API
      but not providing AT_SECURE in the aux vector at startup.
      
      in principle applications should be checking errno anyway, but this
      does not really work. to be secure, the caller would have to treat
      ENOENT (indeterminate result) as possibly-suid and thereby disable
      functionality in the typical non-suid usage case. and since glibc only
      runs on kernels that provide AT_SECURE, applications written to the
      glibc getauxval API might simply assume it succeeds.
      7bece9c2
    • R
      remove useless infinite loop from end of exit function · 5cc18721
      Rich Felker 提交于
      this was originally added as a cheap but portable way to quell
      warnings about reaching the end of a function that does not return,
      but since _Exit is marked _Noreturn, it's not needed. removing it
      makes the call to _Exit into a tail call and shaves off a few bytes of
      code from minimal static programs.
      5cc18721
    • R
      fix crash in regexec for nonzero nmatch argument with REG_NOSUB · 72ed3d47
      Rich Felker 提交于
      per POSIX, the nmatch and pmatch arguments are ignored when the regex
      was compiled with REG_NOSUB.
      72ed3d47
  6. 17 7月, 2014 2 次提交
    • R
      work around constant folding bug 61144 in gcc 4.9.0 and 4.9.1 · a6adb2bc
      Rich Felker 提交于
      previously we detected this bug in configure and issued advice for a
      workaround, but this turned out not to work. since then gcc 4.9.0 has
      appeared in several distributions, and now 4.9.1 has been released
      without a fix despite this being a wrong code generation bug which is
      supposed to be a release-blocker, per gcc policy.
      
      since the scope of the bug seems to affect only data objects (rather
      than functions) whose definitions are overridable, and there are only
      a very small number of these in musl, I am just changing them from
      const to volatile for the time being. simply removing the const would
      be sufficient to make gcc 4.9.1 work (the non-const case was
      inadvertently fixed as part of another change in gcc), and this would
      also be sufficient with 4.9.0 if we forced -O0 on the affected files
      or on the whole build. however it's cleaner to just remove all the
      broken compiler detection and use volatile, which will ensure that
      they are never constant-folded. the quality of a non-broken compiler's
      output should not be affected except for the fact that these objects
      are no longer const and thus possibly add a few bytes to data/bss.
      
      this change can be reconsidered and possibly reverted at some point in
      the future when the broken gcc versions are no longer relevant.
      a6adb2bc
    • R
      simplify __stdio_exit static linking logic · c463e11e
      Rich Felker 提交于
      the purpose of this logic is to avoid linking __stdio_exit unless any
      stdio reads (which might require repositioning the file offset at exit
      time) or writes (which might require flushing at exit time) could have
      been performed.
      
      previously, exit called two wrapper functions for __stdio_exit named
      __flush_on_exit and __seek_on_exit. both of these functions actually
      performed both tasks (seek and flushing) by calling the underlying
      __stdio_exit. in order to avoid doing this twice, an overridable data
      object __towrite_used was used to cause __seek_on_exit to act as a nop
      when __towrite was linked.
      
      now, exit only makes one call, directly to __stdio_exit. this is
      satisfiable by a weak dummy definition in exit.c, but the real
      definition is pulled in by either __toread.c or __towrite.c through
      their referencing a symbol which is defined only in __stdio_exit.c.
      c463e11e
  7. 12 7月, 2014 4 次提交
    • R
      implement the LOG_CONS option in syslog · 781f26bc
      Rich Felker 提交于
      this was previously a no-op, somewhat intentionally, because I failed
      to understand that it only has an effect when sending to the logging
      facility fails and thus is not the nuisance that it would be if always
      sent output to the console.
      781f26bc
    • R
      suppress early syslog return when log socket cannot be opened · a64a045d
      Rich Felker 提交于
      this behavior is no longer valid in general, and was never necessary.
      if the LOG_PERROR option is set, output to stderr could still succeed.
      also, when the LOG_CONS option is added, it will need syslog to
      proceed even if opening the log socket fails.
      a64a045d
    • R
      implement the LOG_PERROR option in syslog · b8c4cf61
      Rich Felker 提交于
      this is a nonstandard feature, but easy and inexpensive to add. since
      the corresponding macro has always been defined in our syslog.h, it
      makes sense to actually support it. applications may reasonably be
      using the presence of the macro to assume that the feature is
      supported.
      
      the behavior of omitting the 'header' part of the log message does not
      seem to be well-documented, but matches other implementations (at
      least glibc) which have this option.
      
      based on a patch by Clément Vasseur, but simplified using %n.
      b8c4cf61
    • C
      fix the %m specifier in syslog · da271181
      Clément Vasseur 提交于
      errno must be saved upon vsyslog entry, otherwise its value could be
      changed by some libc function before reaching the %m handler in
      vsnprintf.
      da271181
  8. 11 7月, 2014 2 次提交
  9. 09 7月, 2014 1 次提交
    • R
      fix typo in microblaze setjmp asm · 72967368
      Rich Felker 提交于
      r24 was wrongly being saved at a misaligned offset of 30 rather than
      the correct offset of 40 in the jmp_buf. the exact effects of this
      error have not been studied, but it's clear that the value of r24 was
      lost across setjmp/longjmp and the saved values of r21 and/or r22 may
      also have been corrupted.
      72967368
  10. 07 7月, 2014 2 次提交
  11. 06 7月, 2014 2 次提交
    • R
      fix multiple issues in legacy function getpass · ea496d6c
      Rich Felker 提交于
      1. failure to output a newline after the password is read
      2. fd leaks via missing FD_CLOEXEC
      3. fd leaks via failure-to-close when any of the standard streams are
         closed at the time of the call
      4. wrongful fallback to use of stdin when opening /dev/tty fails
      5. wrongful use of stderr rather than /dev/tty for prompt
      6. failure to report error reading password
      ea496d6c
    • R
      eliminate use of cached pid from thread structure · 83dc6eb0
      Rich Felker 提交于
      the main motivation for this change is to remove the assumption that
      the tid of the main thread is also the pid of the process. (the value
      returned by the set_tid_address syscall was used to fill both fields
      despite it semantically being the tid.) this is historically and
      presently true on linux and unlikely to change, but it conceivably
      could be false on other systems that otherwise reproduce the linux
      syscall api/abi.
      
      only a few parts of the code were actually still using the cached pid.
      in a couple places (aio and synccall) it was a minor optimization to
      avoid a syscall. caching could be reintroduced, but lazily as part of
      the public getpid function rather than at program startup, if it's
      deemed important for performance later. in other places (cancellation
      and pthread_kill) the pid was completely unnecessary; the tkill
      syscall can be used instead of tgkill. this is actually a rather
      subtle issue, since tgkill is supposedly a solution to race conditions
      that can affect use of tkill. however, as documented in the commit
      message for commit 7779dbd2, tgkill
      does not actually solve this race; it just limits it to happening
      within one process rather than between processes. we use a lock that
      avoids the race in pthread_kill, and the use in the cancellation
      signal handler is self-targeted and thus not subject to tid reuse
      races, so both are safe regardless of which syscall (tgkill or tkill)
      is used.
      83dc6eb0
  12. 03 7月, 2014 4 次提交
    • R
      properly pass current locale to *_l functions when used internally · 4c48501e
      Rich Felker 提交于
      this change is presently non-functional since the callees do not yet
      use their locale argument for anything.
      4c48501e
    • R
      consolidate str[n]casecmp_l into str[n]casecmp source files · 7424ac58
      Rich Felker 提交于
      this is mainly done for consistency with the ctype functions and to
      declutter the src/locale directory.
      7424ac58
    • R
      consolidate *_l ctype/wctype functions into their non-_l source files · d89fdec5
      Rich Felker 提交于
      the main practical purposes of this commit are to remove a huge amount
      of clutter from the src/locale directory, to cut down on the length of
      the $(AR) and $(LD) command lines, and to reduce the amount of space
      wasted by object file headers in the static libc.a. build time may
      also be reduced, though this has not been measured.
      
      as an additional justification, if there ever were a need for the
      behavior of these functions to vary by locale, it would be necessary
      for the non-_l versions to call the _l versions, so that linking the
      former without the latter would not be possible anyway.
      d89fdec5
    • R
      add locale framework · 0bc03091
      Rich Felker 提交于
      this commit adds non-stub implementations of setlocale, duplocale,
      newlocale, and uselocale, along with the data structures and minimal
      code needed for representing the active locale on a per-thread basis
      and optimizing the common case where thread-local locale settings are
      not in use.
      
      at this point, the data structures only contain what is necessary to
      represent LC_CTYPE (a single flag) and LC_MESSAGES (a name for use in
      finding message translation files). representation for the other
      categories will be added later; the expectation is that a single
      pointer will suffice for each.
      
      for LC_CTYPE, the strings "C" and "POSIX" are treated as special; any
      other string is accepted and treated as "C.UTF-8". for other
      categories, any string is accepted after being truncated to a maximum
      supported length (currently 15 bytes). for LC_MESSAGES, the name is
      kept regardless of whether libc itself can use such a message
      translation locale, since applications using catgets or gettext should
      be able to use message locales libc is not aware of. for other
      categories, names which are not successfully loaded as locales (which,
      at present, means all names) are treated as aliases for "C". setlocale
      never fails.
      
      locale settings are not yet used anywhere, so this commit should have
      no visible effects except for the contents of the string returned by
      setlocale.
      0bc03091