summaryrefslogtreecommitdiff
path: root/src/network
AgeCommit message (Collapse)AuthorFilesLines
2014-09-05remove an extra layer of buffer copying in getnameinfo reverse dnsRich Felker1-3/+2
the outer getnameinfo function already has a properly-sized temporary buffer for storing the reverse dns (ptr) result. there is no reason for the callback to use a secondary buffer and copy it on success, and doing so potentially expanded the impact of the dn_expand bug that was fixed in commit 49d2c8c6bcf8c926e52c7f510033b6adc31355f5. this change reduces the code size by a small amount, and also reduces the run-time stack space requirements by about 256 bytes.
2014-09-04fix dn_expand empty name handling and offsets to 0Szabolcs Nagy1-6/+9
Empty name was rejected in dn_expand since commit 56b57f37a46dab432247bf29d96fcb11fbd02a6d which is a regression as reported by Natanael Copa. Furthermore if an offset pointer in a compressed name pointed to a terminating 0 byte (instead of a label) the returned name was not null terminated.
2014-07-29reimplement if_nameindex and getifaddrs using netlinkTimo Teräs4-184/+411
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.
2014-07-26add support for LC_TIME and LC_MESSAGES translationsRich Felker2-2/+6
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.
2014-06-24add routing protocols to getprotoent-family functionsTimo Teräs1-0/+2
iptables and quagga need them to work.
2014-06-21implement result address sorting in the resolver (getaddrinfo, etc.)Rich Felker2-0/+136
2014-06-20fix gethostby*_r result pointer value on errorTimo Teräs2-0/+3
according to the documentation in the man pages, the GNU extension functions gethostbyaddr_r, gethostbyname_r and gethostbyname2_r are guaranteed to set the result pointer to NULL in case of error or no result.
2014-06-20fix sendmmsg emulation return value for zero-length vectorRich Felker1-0/+1
this case is not even documented, but the kernel returns 0 here and it makes sense to be consistent.
2014-06-19implement sendmmsg and recvmmsgRich Felker2-0/+44
these are not pure syscall wrappers because they have to work around kernel API bugs on 64-bit archs. the workarounds could probably be made somewhat more efficient, but at the cost of more complexity. this may be revisited later.
2014-06-07avoid spurious lookup failures from badly-behaved nameserversRich Felker1-5/+22
the results of a dns query, whether it's performed as part of one of the standard name-resolving functions or directly by res_send, should be a function of the query, not of the particular nameserver that responds to it. thus, all responses which indicate a failure or refusal by the nameserver, as opposed to a positive or negative result for the query, should be ignored. the strategy used is to re-issue the query immediately (but with a limit on the number of retries, in case the server is really broken) when a response code of 2 (server failure, typically transient) is seen, and otherwise take no action on bad responses (which generally indicate a misconfigured nameserver or one which the client does not have permission to use), allowing the normal retry interval to apply and of course accepting responses from other nameservers queried in parallel. empirically this matches the traditional resolver behavior for nameservers that respond with a code of 2 in the case where there is just a single nameserver configured. the behavior diverges when multiple nameservers are available, since musl is querying them in parallel. in this case we are mildly more aggressive at retrying.
2014-06-06optimize SOCK_CLOEXEC fallback for socket functionRich Felker1-2/+2
the fcntl function is heavy, so make the syscall directly instead. also, avoid the code size and runtime overhead of querying the old flags, since it's reasonable to assume nothing will be set on a newly-created socket. this code is only used on old kernels which lack proper atomic close-on-exec support, so future changes that might invalidate such an assumption do not need to be considered.
2014-06-06add SOCK_CLOEXEC fallback for socketpair on old kernelsRich Felker1-1/+19
as usual, this is non-atomic, but better than producing an error or failing to set the close-on-exec flag at all.
2014-06-06implement dn_comp RFC 1035 domain name compressionSzabolcs Nagy1-1/+102
the input name is validated, the other parameters are assumed to be valid (the list of already compressed names are not checked for infinite reference loops or out-of-bound offsets). names are handled case-sensitively for now.
2014-06-06accept trailing . and empty domain namesSzabolcs Nagy3-12/+16
trailing . should be accepted in domain name strings by convention (RFC 1034), host name lookup accepts "." but rejects empty "", res_* interfaces also accept empty name following existing practice.
2014-06-05fix the domain name length limit checksSzabolcs Nagy3-8/+8
A domain name is at most 255 bytes long (RFC 1035), but the string representation is two bytes smaller so the strlen maximum is 253.
2014-06-05fix multiple validation issues in dns response label parsingSzabolcs Nagy1-4/+6
Due to an error introduced in commit fcc522c92335783293ac19df318415cd97fbf66b, checking of the remaining output buffer space was not performed correctly, allowing malformed input to write past the end of the buffer. In addition, the loop detection logic failed to account for the possibility of infinite loops with no output, which would hang the function. The output size is now limited more strictly so only names with valid length are accepted.
2014-06-05fix missing function declarations in refactored ip literal parsing codeRich Felker1-0/+1
2014-06-04add support for reverse port lookups from services file to getnameinfoRich Felker1-4/+35
this also affects the legacy getservbyport family, which uses getnameinfo as its backend.
2014-06-04add support for reverse name lookups from hosts file to getnameinfoRich Felker5-50/+122
this also affects the legacy gethostbyaddr family, which uses getnameinfo as its backend. some other minor changes associated with the refactoring of source files are also made; in particular, the resolv.conf parser now uses the same code that's used elsewhere to handle ip literals, so as a side effect it can now accept a scope id for nameserver addressed with link-local scope.
2014-06-04remove some dummy "ent" function aliases that duplicated real onesRich Felker1-8/+0
the service and protocol functions are defined also in other files, and the protocol ones are actually non-nops elsewhere, so the weak definitions in ent.c could have prevented the strong definitions from getting pulled in and used in some static programs.
2014-06-04add support for ipv6 scope_id to getaddrinfo and getnameinfoRich Felker3-8/+56
for all address types, a scope_id specified as a decimal value is accepted. for addresses with link-local scope, a string containing the interface name is also accepted. some changes are made to error handling to avoid unwanted fallbacks in the case where the scope_id is invalid: if an earlier name lookup backend fails with an error rather than simply "0 results", this failure now suppresses any later attempts with other backends. in getnameinfo, a light "itoa" type function is added for generating decimal scope_id results, and decimal port strings for services are also generated using this function now so as not to pull in the dependency on snprintf. in netdb.h, a definition for the NI_NUMERICSCOPE flag is added. this is required by POSIX (it was previously missing) and needed to allow callers to suppress interface-name lookups.
2014-06-03fix if_nametoindex return value when interface does not existRich Felker1-1/+1
the return value is unsigned, so negative results for "errors" do not make sense; 0 is the value reserved for when the interface name does not exist.
2014-06-03fix negative response and non-response handling for dns queriesRich Felker1-1/+4
previously, all failures to obtain at least one address were treated as nonexistant names (EAI_NONAME). this failed to account for the possibility of transient failures (no response at all, or a response with rcode of 2, server failure) or permanent failures that do not indicate the nonexistence of the requested name. only an rcode of 3 should be treated as an indication of nonexistence.
2014-06-03fix some validation checks in dns response parsing codeRich Felker1-2/+3
since the buffer passed always has an actual size of 512 bytes, the maximum possible response packet size, no out-of-bounds access was possible; however, reading past the end of the valid portion of the packet could cause the parser to attempt to process junk as answer content.
2014-06-02remove cruft from old resolver and numeric ip parsingRich Felker6-79/+49
the old resolver code used a function __ipparse which contained the logic for inet_addr and inet_aton, which is needed in getaddrinfo. this was phased out in the resolver overhaul in favor of directly using inet_aton and inet_pton as appropriate. this commit cleans up some stuff that was left behind.
2014-06-02switch standard resolver functions to use the new dns backendRich Felker4-309/+145
this is the third phase of the "resolver overhaul" project. this commit removes all of the old dns code, and switches the __lookup_name backend (used by getaddrinfo, etc.) and the getnameinfo function to use the newly implemented __res_mkquery and __res_msend interfaces. for parsing the results, a new callback-based __dns_parse function, based on __dns_get_rr from the old dns code, is used.
2014-06-02fix uninitialized variable in new __res_msend dns functionRich Felker1-0/+1
2014-06-02implement new dns backend, res_send and other legacy resolver functionsRich Felker6-18/+263
this is the second phase of the "resolver overhaul" project. the key additions in this commit are the __res_msend and __res_mkquery functions, which have been factored so as to provide a backend for both the legacy res_* functions and the standard getaddrinfo and getnameinfo functions. the latter however are still using the old backend code; there is code duplication which still needs to be removed, and this will be the next phase of the resolver overhaul. __res_msend is derived from the old __dns_doqueries function, but generalized to send arbitrary caller-provided packets in parallel rather than producing the parallel queries itself. this allows it to be used (completely trivially) as a backend for res_send. the factored-out query generation code, with slightly more generality, is now part of __res_mkquery.
2014-06-02add ipsec and tunneling protocols to getprotoent-family functionsTimo Teräs1-0/+4
iptables and ipsec-tools among others require these to function properly.
2014-06-02fix off-by-one in checking hostname length in new resolver backendRich Felker1-2/+2
this bug was introduced in the recent resolver overhaul commits. it likely had visible symptoms. these were probably limited to wrongly accepting truncated versions of over-long names (vs rejecting them), as opposed to stack-based overflows or anything more severe, but no extensive checks were made. there have been no releases where this bug was present.
2014-06-01improve getservbyname_r using new resolver backendRich Felker2-22/+16
now that host and service lookup have been separated in the backend, there's no need for service lookup functions to pull in the host lookup code. moreover, dynamic allocation is no longer needed, so this function should now be async-signal-safe. it's also significantly smaller. one change in getservbyname is also made: knowing that getservbyname_r needs only two character pointers in the caller-provided buffer, some wasted bss can be avoided.
2014-06-01improve gethostbyname2_r using new resolver backendRich Felker1-35/+22
these changes reduce the size of the function somewhat and remove many of its dependencies, including free. in principle it should now be async-signal-safe, but this has not been verified in detail. minor changes to error handling are also made.
2014-05-31refactor getaddrinfo and add support for most remaining featuresRich Felker4-228/+360
this is the first phase of the "resolver overhaul" project. conceptually, the results of getaddrinfo are a direct product of a list of address results and a list of service results. the new code makes this explicit by computing these lists separately and combining the results. this adds support for services that have both tcp and udp versions, where the caller has not specified which it wants, and eliminates a number of duplicate code paths which were all producing the final output addrinfo structures, but in subtly different ways, making it difficult to implement any of the features which were missing. in addition to the above benefits, the refactoring allows for legacy functions like gethostbyname to be implemented without using the getaddrinfo function itself. such changes to the legacy functions have not yet been made, however. further improvements include matching of service alias names from /etc/services (previously only the primary name was supported), returning multiple results from /etc/hosts (previously only the first matching line was honored), and support for the AI_V4MAPPED and AI_ALL flags. features which remain unimplemented are IDN translations (encoding non-ASCII hostnames for DNS lookup) and the AI_ADDRCONFIG flag. at this point, the DNS-based name resolving code is still based on the old interfaces in __dns.c, albeit somewhat simpler in its use of them. there may be some dead code which could already be removed, but changes to this layer will be a later phase of the resolver overhaul.
2014-02-21add fallback emulation for accept4 on old kernelsRich Felker1-1/+12
the other atomic FD_CLOEXEC interfaces (dup3, pipe2, socket) already had such emulation in place. the justification for doing the emulation here is the same as for the other functions: it allows applications to simply use accept4 rather than having to have their own fallback code for ENOSYS/EINVAL (which one you get is arch-specific!) and there is no reasonable way an application could benefit from knowing the operation is emulated/non-atomic since there is no workaround at the application level for non-atomicity (that is the whole reason these interfaces were added).
2014-02-13add ipv6 and icmpv6 to getprotoent-family functionsRich Felker1-1/+3
based on patch by orc.
2014-02-13fix typo in table for getprotoent that caused out-of-bound readsRich Felker1-1/+1
this was unlikely to lead to any crash or dangerous behavior, but caused adjacent string constants to be treated as part of the protocols table, possibly returning nonsensical results for unknown protocol names/numbers or when getprotoent was called in a loop to enumerate all protocols.
2014-01-06fix argument types for legacy function inet_makeaddrRich Felker1-2/+1
the type int was taken from seemingly erroneous man pages. glibc uses in_addr_t (uint32_t), and semantically, the arguments should be unsigned.
2013-12-20implement legacy function herrorRich Felker1-0/+8
based on patch by Timo Teräs; greatly simplified to use fprintf.
2013-12-12include cleanups: remove unused headers and add feature test macrosSzabolcs Nagy13-18/+3
2013-12-12remove an unnecessary check in inet_ptonSzabolcs Nagy1-2/+1
at most 4 hexadecimal digits are processed in one field so the value cannot overflow. the netdb.h header was not used.
2013-11-30support mix of IPv4 and v6 nameservers in resolv.confRich Felker1-5/+31
a v6 socket will only be used if there is at least one v6 nameserver address. if the kernel lacks v6 support, the code will fall back to using a v4 socket and requests to v6 servers will silently fail. when using a v6 socket, v4 addresses are converted to v4-mapped form and setsockopt is used to ensure that the v6 socket can accept both v4 and v6 traffic (this is on-by-default on Linux but the default is configurable in /proc and so it needs to be set explicitly on the socket level). this scheme avoids increasing resource usage during lookups and allows the existing network io loop to be used without modification. previously, nameservers whose address family did not match the address family of the first-listed nameserver were simply ignored. prior to recent __ipparse fixes, they were not ignored but erroneously parsed.
2013-11-27reject invalid address families in getaddrinfoRich Felker1-0/+3
subsequent code assumes the address family requested is either unspecified or one of IPv4/IPv6, and could malfunction if this constraint is not met, so other address families should be explicitly rejected.
2013-11-25remove duplicate includes from dynlink.c, strfmon.c and getaddrinfo.cSzabolcs Nagy1-3/+0
2013-11-24Fix dn_comp prototype and add stubMichael Forney1-0/+9
This function is used by ping6 from iputils.
2013-11-23Fix dn_expand pointer followingMichael Forney1-1/+1
2013-11-20fix fd leak (missing close-on-exec) in getifaddrsRich Felker1-1/+1
2013-11-02fix regression in inet_aton due to misinterpretation of __ipparse returnRich Felker2-3/+3
inet_aton returns a boolean success value, whereas __ipparse returns 0 on success and -1 on failure. also change the conditional in inet_addr to be consistent with other uses of __ipparse where only negative values are treated as failure.
2013-10-23fix inet_ptonSzabolcs Nagy1-26/+19
* parse IPv4 dotted-decimal correctly (without strtoul, no leading zeros) * disallow single leading ':' in IPv6 address * allow at most 4 hex digits in IPv6 address (according to RFC 2373) * have enough hex fields in IPv4 mapped IPv6 address * disallow leading zeros in IPv4 mapped IPv6 address
2013-10-22fix __ipparse to parse the generic numbers-and-dots IPv4 format correctlySzabolcs Nagy1-5/+12
* allow at most 4 parts * bounds check the parts correctly * disallow leading whitespace and sign * check the address family before falling back to IPv6
2013-10-22fix inet_aton to accept the generic "numbers-and-dots" IPv4 address formatSzabolcs Nagy1-1/+4