1. 30 7月, 2014 3 次提交
    • R
      fix terminal control ioctl constants for sh · cbb609b3
      Rich Felker 提交于
      this commit changes the names to match the kernel names, exposing
      under the normal names the "old" versions which work with a smaller
      termios structure compatible with the userspace structure, and
      renaming the "new" versions with "2" on the end like the kernel has.
      
      this fixes spurious warnings "Unsupported ioctl: cmd=0x802c542a" from
      qemu-sh4 and should be more correct anyway, since our userspace
      termios structure does not have meaningful information in the part
      which the kernel would be interpreting as speeds with the new ioctl.
      cbb609b3
    • S
      tweaks to plural rules evaluator · a126188f
      Szabolcs Nagy 提交于
      const parsing, depth accounting and failure handling was changed
      a bit so the generated code is slightly smaller.
      a126188f
    • R
      harden dcngettext plural processing · e4dd0ab8
      Rich Felker 提交于
      while the __mo_lookup backend can verify that the translated message
      ends with a null terminator, is has no way to know nplurals and thus
      no way to verify that sufficiently many null terminators are present
      in the string to satisfy all plural forms. the code in dcngettext was
      already attempting to avoid reading past the end of the mo file
      mapping, but failed to do so because the strlen call itself could
      over-read. using strnlen instead allows us to avoid the problem.
      e4dd0ab8
  2. 29 7月, 2014 2 次提交
    • R
      harden mo file processing for locale/translations · 6e892106
      Rich Felker 提交于
      rather than just checking that the start of the string lies within the
      mapping, also check that the nominal length remains within the
      mapping, and that the null terminator is present at the nominal
      length. this ensures that the caller, using the result as a C string,
      will not read past the end of the mapping.
      
      the nominal length is never exposed to the caller, but it's useful
      internally to find where the null terminator should be without having
      to restort to linear search via strnlen/memchr.
      6e892106
    • R
      implement non-default plural rules for ngettext translations · 73d2a3bf
      Rich Felker 提交于
      the new code in dcngettext was written by me, and the expression
      evaluator by Szabolcs Nagy (nsz).
      73d2a3bf
  3. 28 7月, 2014 3 次提交
    • R
      remove unused a_cas_l from or1k atomic.h · c0284b37
      Rich Felker 提交于
      this follows the same logic as in the previous commit for other archs.
      c0284b37
    • R
      clean up unused and inconsistent atomics in arch dirs · 90e51e45
      Rich Felker 提交于
      the a_cas_l, a_swap_l, a_swap_p, and a_store_l operations were
      probably used a long time ago when only i386 and x86_64 were
      supported. as other archs were added, support for them was
      inconsistent, and they are obviously not in use at present. having
      them around potentially confuses readers working on new ports, and the
      type-punning hacks and inconsistent use of types in their definitions
      is not a style I wish to perpetuate in the source tree, so removing
      them seems appropriate.
      90e51e45
    • R
      fix insufficient synchronization in sh atomic asm · c394763d
      Rich Felker 提交于
      while other usage I've seen only has the synco instruction after the
      atomic operation, I cannot find any documentation indicating that this
      is correct. certainly all stores before the atomic need to have been
      synchronized before the atomic operation takes place.
      c394763d
  4. 27 7月, 2014 1 次提交
    • R
      implement gettext message translation functions · 2068b4e8
      Rich Felker 提交于
      this commit replaces the stub implementations with working message
      translation functions. translation units are factored so as to prevent
      pulling in the legacy, non-library-safe functions which use a global
      textdomain in modern code which is using the versions with an explicit
      domain argument. bind_textdomain_codeset is also placed in its own
      file since it should not be needed by most programs.
      
      this implementation is still missing some features: the LANGUAGE
      environment variable (for multiple fallback languages) is not honored,
      and non-default plural-form rules are not supported. these issues will
      be addressed in a later commit.
      
      one notable difference from the GNU implementation is that there is no
      default path for loading translation files. in principle one could be
      added, but since the documented correct usage is to call the
      bindtextdomain function, a default path is probably unnecessary.
      2068b4e8
  5. 26 7月, 2014 4 次提交
    • R
      add support for LC_TIME and LC_MESSAGES translations · c5b8f193
      Rich Felker 提交于
      for LC_MESSAGES, translation of strerror and similar literal message
      functions is supported. for messages in other places (particularly the
      dynamic linker) that use format strings, translation is not yet
      supported. in order to make it possible and safe, such messages will
      need to be refactored to separate the textual content from the format.
      
      for LC_TIME, the day and month names and strftime-style format strings
      provided by nl_langinfo are supported for translation. however there
      may be limitations, as some of the original C-locale nl_langinfo
      strings are non-unique and thus perhaps non-suitable as keys.
      
      overall, the locale support activated by this commit should not be
      seen as complete and polished but as a basis for beginning to test
      locale functionality and implement locales.
      c5b8f193
    • R
      add missing yes/no strings to nl_langinfo · 0206f596
      Rich Felker 提交于
      these were removed from the standard but still offered as an extension
      in langinfo.h, so nl_langinfo should support them.
      0206f596
    • R
      fix nl_langinfo table for LC_TIME era-related items · a19cd2b6
      Rich Felker 提交于
      due to a skipped slot and missing null terminator, the last few
      strings were off by one or two slots from their item codes.
      a19cd2b6
    • R
      implement mo file string lookup for translations · 41421d6b
      Rich Felker 提交于
      the core is based on a binary search; hash table is not used. both
      native and reverse-endian mo files are supported. all offsets read
      from the mapped mo file are checked against the mapping size to
      prevent the possibility of reads outside the mapping.
      
      this commit has no observable effects since there are not yet any
      callers to the message translation code.
      41421d6b
  6. 24 7月, 2014 2 次提交
  7. 21 7月, 2014 5 次提交
  8. 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
  9. 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
  10. 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
  11. 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
  12. 12 7月, 2014 1 次提交
    • 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