1. 31 7月, 2014 2 次提交
    • R
      provide PAGE_SIZE as a constant value of 8192 on or1k · cc54f0ae
      Rich Felker 提交于
      according to Stefan Kristiansson, or1k page size is not actually
      variable and the value of 8192 is part of the ABI.
      cc54f0ae
    • S
      plural rule evaluator rewrite for dcngettext · 6527b03d
      Szabolcs Nagy 提交于
      using an operator precedence parser the code size
      became smaller and it is only slower by about %10
      
      size of old vs new pleval.o on different archs:
      (with inlined isspace added to pleval.c for now)
      
      old:
         text    data     bss     dec     hex filename
          828       0       0     828     33c pl.i386.o
         1152       0       0    1152     480 pl.arm.o
         1704       0       0    1704     6a8 pl.mips.o
         1328       0       0    1328     530 pl.ppc.o
          992       0       0     992     3e0 pl.x64.o
      new:
         text    data     bss     dec     hex filename
          693       0       0     693     2b5 pl.i386.o
          972       0       0     972     3cc pl.arm.o
         1276       0       0    1276     4fc pl.mips.o
         1087       0       0    1087     43f pl.ppc.o
          846       0       0     846     34e pl.x64.o
      6527b03d
  2. 30 7月, 2014 4 次提交
    • T
      reimplement if_nameindex and getifaddrs using netlink · 08e4052c
      Timo Teräs 提交于
      the previous implementations had several deficiencies, the most severe
      of which was the inability to report unconfigured interfaces or
      interfaces without ipv4 addresses. among the options discussed for
      fixing this, using netlink turned out to be the one with the least
      cost and most additional advantages. other improvements include:
      
      if_nameindex now avoids duplicates in the list it produces, but still
      includes legacy-style interface aliases if any are in use.
      
      getifaddrs now reports hardware addresses and includes the scope_id
      for link-local ipv6 addresses in the resulting address.
      08e4052c
    • 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
  3. 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
  4. 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
  5. 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
  6. 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
  7. 24 7月, 2014 2 次提交
  8. 21 7月, 2014 5 次提交
  9. 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
  10. 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
  11. 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