1. 13 9月, 2018 7 次提交
    • R
      reduce spurious inclusion of libc.h · 5ce37379
      Rich Felker 提交于
      libc.h was intended to be a header for access to global libc state and
      related interfaces, but ended up included all over the place because
      it was the way to get the weak_alias macro. most of the inclusions
      removed here are places where weak_alias was needed. a few were
      recently introduced for hidden. some go all the way back to when
      libc.h defined CANCELPT_BEGIN and _END, and all (wrongly implemented)
      cancellation points had to include it.
      
      remaining spurious users are mostly callers of the LOCK/UNLOCK macros
      and files that use the LFS64 macro to define the awful *64 aliases.
      
      in a few places, new inclusion of libc.h is added because several
      internal headers no longer implicitly include libc.h.
      
      declarations for __lockfile and __unlockfile are moved from libc.h to
      stdio_impl.h so that the latter does not need libc.h. putting them in
      libc.h made no sense at all, since the macros in stdio_impl.h are
      needed to use them correctly anyway.
      5ce37379
    • R
      3fe595de
    • R
      7e399fab
    • R
      overhaul internally-public declarations using wrapper headers · 13d1afa4
      Rich Felker 提交于
      commits leading up to this one have moved the vast majority of
      libc-internal interface declarations to appropriate internal headers,
      allowing them to be type-checked and setting the stage to limit their
      visibility. the ones that have not yet been moved are mostly
      namespace-protected aliases for standard/public interfaces, which
      exist to facilitate implementing plain C functions in terms of POSIX
      functionality, or C or POSIX functionality in terms of extensions that
      are not standardized. some don't quite fit this description, but are
      "internally public" interfacs between subsystems of libc.
      
      rather than create a number of newly-named headers to declare these
      functions, and having to add explicit include directives for them to
      every source file where they're needed, I have introduced a method of
      wrapping the corresponding public headers.
      
      parallel to the public headers in $(srcdir)/include, we now have
      wrappers in $(srcdir)/src/include that come earlier in the include
      path order. they include the public header they're wrapping, then add
      declarations for namespace-protected versions of the same interfaces
      and any "internally public" interfaces for the subsystem they
      correspond to.
      
      along these lines, the wrapper for features.h is now responsible for
      the definition of the hidden, weak, and weak_alias macros. this means
      source files will no longer need to include any special headers to
      access these features.
      
      over time, it is my expectation that the scope of what is "internally
      public" will expand, reducing the number of source files which need to
      include *_impl.h and related headers down to those which are actually
      implementing the corresponding subsystems, not just using them.
      13d1afa4
    • R
      move __res_msend_rc declaration to lookup.h · 432f9f0e
      Rich Felker 提交于
      unlike the other res/dn functions, this one is tied to struct
      resolvconf which is not a public interface, so put it in the private
      header for its subsystem.
      432f9f0e
    • R
      move and deduplicate declarations of __dns_parse to make it checkable · c98bf5b8
      Rich Felker 提交于
      the source file for this function is completely standalone, but it
      doesn't seem worth adding a header just for it, so declare it in
      lookup.h for now.
      c98bf5b8
    • R
      fix issues from public functions defined without declaration visible · c221d3e5
      Rich Felker 提交于
      policy is that all public functions which have a public declaration
      should be defined in a context where that public declaration is
      visible, to avoid preventable type mismatches.
      
      an audit performed using GCC's -Wmissing-declarations turned up the
      violations corrected here. in some cases the public header had not
      been included; in others, a feature test macro needed to make the
      declaration visible had been omitted.
      
      in the case of gethostent and getnetent, the omission seems to have
      been intentional, as a hack to admit a single stub definition for both
      functions. this kind of hack is no longer acceptable; it's UB and
      would not fly with LTO or advanced toolchains. the hack is undone to
      make exposure of the declarations possible.
      c221d3e5
  2. 03 9月, 2018 1 次提交
  3. 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
  4. 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
  5. 27 6月, 2018 2 次提交
    • 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
    • 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
  6. 10 11月, 2017 1 次提交
  7. 19 10月, 2017 1 次提交
    • R
      in dns parsing callback, enforce MAXADDRS to preclude overflow · 45ca5d3f
      Rich Felker 提交于
      MAXADDRS was chosen not to need enforcement, but the logic used to
      compute it assumes the answers received match the RR types of the
      queries. specifically, it assumes that only one replu contains A
      record answers. if the replies to both the A and the AAAA query have
      their answer sections filled with A records, MAXADDRS can be exceeded
      and clobber the stack of the calling function.
      
      this bug was found and reported by Felix Wilhelm.
      45ca5d3f
  8. 07 9月, 2017 1 次提交
    • R
      don't treat numeric port strings as servent records in getservby*() · 565dbee2
      Rich Felker 提交于
      some applications use getservbyport to find port numbers that are not
      assigned to a service; if getservbyport always succeeds with a numeric
      string as the result, they fail to find any available ports.
      
      POSIX doesn't seem to mandate the behavior one way or another. it
      specifies an abstract service database, which an implementation could
      define to include numeric port strings, but it makes more sense to
      align behavior with traditional implementations.
      
      based on patch by A. Wilcox. the original patch only changed
      getservbyport[_r]. to maintain a consistent view of the "service
      database", I have also modified getservbyname[_r] to exclude numeric
      port strings.
      565dbee2
  9. 22 4月, 2017 1 次提交
  10. 12 4月, 2017 1 次提交
    • R
      fix read past end of buffer in getaddrinfo backend · 1ca59755
      Rich Felker 提交于
      due to testing buf[i].family==AF_INET before checking i==cnt, it was
      possible to read past the end of the array, or past the valid part. in
      practice, without active bounds/indeterminate-value checking by the
      compiler, the worst that happened was failure to return early and
      optimize out the sorting that's unneeded for v4-only results.
      
      returning on i==cnt-1 rather than i==cnt would be an alternate fix,
      but the approach this patch takes is more idiomatic and less
      error-prone.
      
      patch by Timo Teräs.
      1ca59755
  11. 15 3月, 2017 1 次提交
  12. 24 9月, 2016 2 次提交
  13. 17 9月, 2016 1 次提交
  14. 07 7月, 2016 1 次提交
  15. 29 6月, 2016 2 次提交
  16. 28 6月, 2016 1 次提交
  17. 05 5月, 2016 1 次提交
  18. 18 4月, 2016 1 次提交
  19. 25 3月, 2016 1 次提交
  20. 02 3月, 2016 1 次提交
    • R
      handle non-matching address family entries in hosts file · 6d70c08a
      Rich Felker 提交于
      name_from_hosts failed to account for the possibility of an address
      family error from name_from_numeric, wrongly counting such a return as
      success and using the uninitialized address data as part of the
      results passed up to the caller.
      
      non-matching address family entries cannot simply be ignored or
      results would be inconsistent with respect to whether AF_UNSPEC or a
      specific address family is queried. instead, record that a
      non-matching entry was seen, and fail the lookup with EAI_NONAME of no
      matching-family entries are found.
      6d70c08a
  21. 29 1月, 2016 6 次提交
    • R
      1563587b
    • R
      fix uninitialized variable in new resolv.conf parser · dcad020c
      Rich Felker 提交于
      dcad020c
    • R
      add support for search domains to dns resolver · 3d6e2e47
      Rich Felker 提交于
      search is only performed if the search or domain keyword is used in
      resolv.conf and the queried name has fewer than ndots dots. there is
      no default domain and names with >=ndots dots are never subjected to
      search; failure in the root scope is final.
      
      the (non-POSIX) res_search API presently does not honor search. this
      may be added at some point in the future if needed.
      
      resolv.conf is now parsed twice, at two different layers of the code
      involved. this will be fixed in a subsequent patch.
      3d6e2e47
    • R
      fix handling of dns response codes · 0fef7ffa
      Rich Felker 提交于
      rcode of 3 (NxDomain) was treated as a hard EAI_NONAME failure, but it
      should instead return 0 (no results) so the caller can continue
      searching. this will be important for adding search domain support.
      the top-level caller will automatically return EAI_NONAME if there are
      zero results at the end.
      
      also, the case where rcode is 0 (success) but there are no results was
      not handled. this happens when the domain exists but there are no A or
      AAAA records for it. in this case a hard EAI_NONAME should be imposed
      to inhibit further search, since the name was defined and just does
      not have any address associated with it. previously a misleading hard
      failure of EAI_FAIL was reported.
      0fef7ffa
    • R
      fe8453d2
    • R
      factor resolv.conf parsing out of res_msend to its own file · d6cb08bc
      Rich Felker 提交于
      this change is made in preparation for adding search domains, for
      which higher-level code will need to parse resolv.conf. simply parsing
      it twice for each lookup would be one reasonable option, but the
      existing parser code was buggy anyway, which suggested to me that it's
      a bad idea to have two variants of this code in two different places.
      
      the old code in res_msend potentially misinterpreted overly long lines
      in resolv.conf, and stopped parsing after it found 3 nameservers, even
      if there were relevant options left to be parsed later in the file.
      d6cb08bc
  22. 18 1月, 2016 1 次提交
  23. 07 1月, 2016 1 次提交
  24. 01 12月, 2015 1 次提交
    • J
      properly handle point-to-point interfaces in getifaddrs() · 7b712844
      Jo-Philipp Wich 提交于
      With point-to-point interfaces, the IFA_ADDRESS netlink attribute
      contains the peer address while an extra attribute IFA_LOCAL carries
      the actual local interface address.
      
      Both the glibc and uclibc implementations of getifaddrs() handle this
      case by moving the ifa_addr contents to the broadcast/remote address
      union and overwriting ifa_addr upon receipt of an IFA_LOCAL attribute.
      
      This patch adds the same special treatment logic of IFA_LOCAL to
      musl's implementation of getifaddrs() in order to align its behaviour
      with that of uclibc and glibc.
      Signed-off-by: NJo-Philipp Wich <jow@openwrt.org>
      7b712844
  25. 27 10月, 2015 2 次提交
    • H
      getnameinfo: make size check not fail for bigger sizes · 6eada2ed
      Hauke Mehrtens 提交于
      getnameinfo() compares the size of the given struct sockaddr with
      sizeof(struct sockaddr_in) and sizeof(struct sockaddr_in6) depending on
      the net family. When you add a sockaddr of size sizeof(struct
      sockaddr_storage) this function will fail because the size of the
      sockaddr is too big. Change the check that it only fails if the size is
      too small, but make it work when it is too big for example when someone
      calls this function with a struct sockaddr_storage and its size.
      This fixes a problem with IoTivity 1.0.0 and musl.
      
      glibc and bionic are only failing if it is smaller, net/freebsd
      implemented the != check.
      Signed-off-by: NHauke Mehrtens <hauke@hauke-m.de>
      6eada2ed
    • R
      safely handle failure to open hosts, services, resolv.conf files · 2683e267
      Rich Felker 提交于
      previously, transient failures like fd exhaustion or other
      resource-related errors were treated the same as non-existence of
      these files, leading to fallbacks or false-negative results. in
      particular:
      
      - failure to open hosts resulted in fallback to dns, possibly yielding
        EAI_NONAME for a hostname that should be defined locally, or an
        unwanted result from dns that the hosts file was intended to
        replace.
      
      - failure to open services resulted in EAI_SERVICE.
      
      - failure to open resolv.conf resulted in querying localhost rather
        than the configured nameservers.
      
      now, only permanent errors trigger the fallback behaviors above; all
      other errors are reportable to the caller as EAI_SYSTEM.
      2683e267