Commit Graph
169 Commits
Author SHA1 Message Date
Rich Felker 5ce3737931 reduce spurious inclusion of libc.h
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.
2018-09-12 14:34:37 -04:00
Rich Felker 3fe595de83 remove or make static various unused __-prefixed symbols 2018-09-12 14:34:35 -04:00
Rich Felker 7e399fabd3 apply hidden visibility to various remaining internal interfaces 2018-09-12 14:34:34 -04:00
Rich Felker 13d1afa46f overhaul internally-public declarations using wrapper headers
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.
2018-09-12 14:34:33 -04:00
Rich Felker 432f9f0e31 move __res_msend_rc declaration to lookup.h
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.
2018-09-12 14:34:30 -04:00
Rich Felker c98bf5b869 move and deduplicate declarations of __dns_parse to make it checkable
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.
2018-09-12 14:34:29 -04:00
Rich Felker c221d3e586 fix issues from public functions defined without declaration visible
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.
2018-09-12 14:34:20 -04:00
Rich Felker 64466094ed fix stack-based oob memory clobber in resolver's result sorting
commit 4f35eb7591 introduced this bug.
it is not present in any released versions. inadvertent use of the &
operator on an array into which we're indexing produced arithmetic on
the wrong-type pointer, with undefined behavior.
2018-09-02 17:08:43 -04:00
Rich Felker 187bcc3bf4 implement getaddrinfo's AI_ADDRCONFIG flag
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.
2018-07-14 20:57:24 -04:00
Rich Felker 4f35eb7591 resolver: don't depend on v4mapped ipv6 to probe routability of v4 addrs
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.
2018-07-11 15:03:34 -04:00
Arthur JonesandRich Felker 5c8e69267b inet_ntop: do not compress single zeros in IPv6
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.
2018-06-26 16:47:31 -04:00
Rich Felker 63e2e40ee3 resolver: omit final dot (root/suppress-search) in canonical name
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.
2018-06-26 16:38:26 -04:00
A. WilcoxandRich Felker 30fdda6c99 fix getaddrinfo error code for non-numeric service with AI_NUMERICSERV
If AI_NUMERICSERV is specified and a numeric service was not provided,
POSIX mandates getaddrinfo return EAI_NONAME. EAI_SERVICE is only for
services that cannot be used on the specified socket type.
2017-11-09 20:15:02 -05:00
Rich Felker 45ca5d3fcb in dns parsing callback, enforce MAXADDRS to preclude overflow
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.
2017-10-18 14:50:03 -04:00
Rich Felker 565dbee24d don't treat numeric port strings as servent records in getservby*()
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.
2017-09-06 21:42:15 -04:00
Rich Felker 1a7fa5e521 fix regression in support for resolv.conf attempts option
commit d6cb08bcac moved the code and
introduced an incorrect string offset for the new parsing, probably
due to a copy-and-paste error.

patch by Stefan Sedich.
2017-04-21 17:34:26 -04:00
Rich Felker 1ca597551b fix read past end of buffer in getaddrinfo backend
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.
2017-04-11 22:09:10 -04:00
Rich Felker 6a209f14ff fix possible fd leak, unrestored cancellation state on dns socket fail 2017-03-14 14:31:34 -04:00
Daniel SabogalandRich Felker 8d7a3f40c8 fix getservby*_r result pointer value on error
this is a clone of the fix to the gethostby*_r functions in
commit fe82bb9b92. the man pages
document that the getservby*_r functions set this pointer to
NULL if there was an error or if no record was found.
2016-09-24 01:10:23 -04:00
Daniel SabogalandRich Felker d917ef0b84 remove dead case in gethostbyname2_r
this case statement was accidently left behind when this function
was refactored in commit e8f39ca489.
2016-09-24 01:09:31 -04:00
Daniel SabogalandRich Felker 32055d52ca fix if_indextoname error case
posix requires errno to be set to ENXIO if the interface does not exist.
linux returns ENODEV instead so we handle this.
2016-09-16 18:03:06 -04:00
Rich Felker 7c82870d45 remove obsolete and unused gethostbyaddr implementation
this code was already under #if 0, but could be confusing if a reader
didn't notice that, and it's almost surely full of bugs and/or
inconsistencies with the current code that uses the gethostbyname2_r
backend.
2016-07-06 21:15:00 -04:00
Natanael CopaandRich Felker 4adc6c33e7 refactor name_from_dns in hostname lookup backend
loop over an address family / resource record mapping to avoid
repetitive code.
2016-06-29 11:59:25 -04:00
Natanael CopaandRich Felker 04bced403d in performing dns lookups, check result from res_mkquery
don't send a query that may be malformed.
2016-06-29 11:57:53 -04:00
Rich Felker 4da0bc5ef8 fix misaligned address buffers in gethostbyname[2][_r] results
mistakenly ordering strings before addresses in the result buffer
broke the alignment that the preceding code had set up.
2016-06-27 17:11:30 -04:00
Andrew KelleyandRich Felker 4b619e5c61 fix incorrect protocol name and number for egp
previously if you called getprotobyname("egp") you would get
NULL because \008 is invalid octal and so the protocol id was
interpreted as 0 and name as "8egp".
2016-05-04 17:24:28 -04:00
Petr VaněkandRich Felker e7d05c7894 remove dead store in res_msend
The variable nss is set to zero in following line.
2016-04-18 01:31:17 -04:00
Timo TeräsandRich Felker 5978eb703c fix gethostbyaddr_r to fill struct hostent.h_length as appropriate 2016-03-24 13:48:47 -04:00
Rich Felker 6d70c08a2c handle non-matching address family entries in hosts file
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.
2016-03-02 00:34:51 -05:00
Rich Felker 1563587b45 reuse parsed resolv.conf in dns core to avoid re-reading/re-parsing 2016-01-28 20:51:31 -05:00
Rich Felker dcad020c9c fix uninitialized variable in new resolv.conf parser 2016-01-28 20:50:30 -05:00
Rich Felker 3d6e2e477c add support for search domains to dns resolver
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.
2016-01-28 20:29:55 -05:00
Rich Felker 0fef7ffac1 fix handling of dns response codes
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.
2016-01-28 19:37:35 -05:00
Rich Felker fe8453d2ee fix logic for matching search/domain keywords in resolv.conf 2016-01-28 19:20:13 -05:00
Rich Felker d6cb08bcac factor resolv.conf parsing out of res_msend to its own file
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.
2016-01-28 18:39:22 -05:00
Ron YorstonandRich Felker 3cdbfb99c3 fix if_nametoindex return value when socket open fails
The return value of if_nametoindex is unsigned; it should return 0
on error.
2016-01-17 17:33:49 -05:00
Timo TeräsandRich Felker d5f8394f6e add missing protocols to protoent lookup functions 2016-01-06 14:31:32 -05:00
Jo-Philipp WichandRich Felker 7b712844e3 properly handle point-to-point interfaces in getifaddrs()
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: Jo-Philipp Wich <[email protected]>
2015-11-30 14:57:25 -05:00
Hauke MehrtensandRich Felker 6eada2edb3 getnameinfo: make size check not fail for bigger sizes
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: Hauke Mehrtens <[email protected]>
2015-10-26 20:00:03 -04:00
Rich Felker 2683e267fa safely handle failure to open hosts, services, resolv.conf files
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.
2015-10-26 18:42:22 -04:00
Rich Felker 2a6e1f0f5a avoid attempting to lookup IP literals as hostnames
previously, __lookup_ipliteral only checked its argument against the
requested address family, so IPv4 literals passed through to
__lookup_name if the caller asked for only IPv6 results, and likewise
for IPv6 literals when the caller asked for only IPv4. this resulted
in spurious DNS lookups that reportedly even succeeded with some
nameservers.

now, __lookup_ipliteral attempts to parse its argument as both IPv4
and IPv6, and returns an error (to stop further search) rather than 0
(no results yet) if the form of the argument mismatches the requested
address family.

based on patch by Julien Ramseier.
2015-09-25 01:18:42 +00:00
Rich Felker 06bcf9bc94 make getaddrinfo return error if both host and service name are null
this case is specified as a mandatory ("shall fail") error.

based on patch by Julien Ramseier.
2015-09-25 01:03:36 +00:00
Timo TeräsandRich Felker cb1c88d42b fix uninitialized scopeid in lookups from hosts file and ip literals 2015-09-11 06:15:06 +00:00
Rich Felker e8cbe0bad4 fix negated return value of ns_skiprr, breakage in related functions
due to a reversed pointer difference computation, ns_skiprr always
returned a negative value, which functions using it would interpret as
an error.

patch by Yu Lu.
2015-07-08 02:46:45 +00:00
Rich Felker fc13acc3dc fix internal buffer overrun in inet_pton
one stop condition for parsing abbreviated ipv6 addressed was missed,
allowing the internal ip[] buffer to overflow. this patch adds the
missing stop condition and masks the array index so that, in case
there are any remaining stop conditions missing, overflowing the
buffer is not possible.
2015-03-23 09:44:18 -04:00
Timo TeräsandRich Felker 6a5242e4cb make protocol table zero byte separated and add ipv6 protocols 2015-02-10 16:54:33 -05:00
Rich Felker c63c98a606 make getaddrinfo support SOCK_RAW and other socket types
all socket types are accepted at this point, but that may be changed
at a later time if the behavior is not meaningful for other types. as
before, omitting type (a value of 0) gives both UDP and TCP results,
and SOCK_DGRAM or SOCK_STREAM restricts to UDP or TCP, respectively.
for other socket types, the service name argument is required to be a
null pointer, and the protocol number provided by the caller is used.
2015-02-07 14:01:34 -05:00
Rich Felker aac59c1164 add basic dns record parsing functions
based on patch by Timo Teräs, with some corrections to bounds checking
code and other minor changes.

while they are borderline scope creep, the functions added are fairly
small and are roughly the minimum code needed to use the results of
the res_query API without re-implementing error-prone DNS packet
parsing, and they are used in practice by some kerberos related
software and possibly other things. at this time there is no intent to
implement further nameser.h API functions.
2014-12-17 14:40:35 -05:00
Rich Felker 633183b5d1 fix potential read past end of buffer in getnameinfo service name lookup
if the loop stopped due to reaching the end of the string, the
subsequent increment could possibly move the position one past the end
of the buffer. no further writes happen, the reads cannot fault anyway
unless the stack completely lacks any zero bytes, and reading junk
should not yield an incorrect result from the function either.
nonetheless the code was wrong and needs to be fixed.
2014-09-05 13:52:20 -04:00
Rich Felker 4ec2d25a6a remove incorrect and useless check in network service name lookup code
the condition was probably intended to be !*p rather than !p, but
neither is needed here. the subsequent code naturally handles the case
where it's already at end of string.
2014-09-05 13:49:47 -04:00