summaryrefslogtreecommitdiff
path: root/src/network
AgeCommit message (Collapse)AuthorFilesLines
2013-08-14fix length computation in dn_expandRich Felker1-3/+5
there are two possible points where the length is evaluated: either the first 'compression' jump, or the null terminator if no jumps have taken place yet. the previous code only measured the length of the first component.
2013-08-14de-duplicate dn_expand, fix return value and signature, clean upRich Felker2-48/+23
the duplicate code in dn_expand and its incorrect return values are both results of the history of the code: the version in __dns.c was originally written with no awareness of the legacy resolver API, and was later copy-and-paste duplicated to provide the legacy API. this commit is the first of a series that will restructure the internal dns code to share as much code as possible with the legacy resolver API functions. I have also removed the loop detection logic, since the output buffer length limit naturally prevents loops. in order to avoid long runtime when encountering a loop if the caller provided a ridiculously long buffer, the caller-provided length is clamped at the maximum dns name length.
2013-07-25fix undefined strcpy call in inet_ntopRich Felker1-1/+1
source and dest arguments for strcpy cannot overlap, so memmove must be used here. the length is already known from the above loop.
2013-07-25make inet_ntop format v4-mapped ipv6 addresses properlyRich Felker1-8/+14
based on a patch by orc. POSIX actually fails to specify the format of the ntop conversion; presumably, any output that will correctly round-trip back via the (well-specified) pton operation is acceptable. the new behavior is much more convenient than the old, however. this patch also affects getnameinfo, which is implemented in terms of inet_ntop and which is the preferred interface for performing this conversion. I've also removed some inexplicable cruft (filling the buffer with 'x' before doing anything) whose origin I was unable to track down.
2013-07-24make getaddrinfo with AF_UNSPEC and null host return both IPv4 and v6Rich Felker1-14/+23
based on a patch by orc, with indexing and flow control cleaned up a little bit. this code is all going to be replaced at some point in the near future.
2013-07-09fix missing SOCK_CLOEXEC in various functions that use sockets internallyRich Felker4-4/+4
2013-07-01add stubs for additional legacy ether.h functionsRich Felker1-0/+15
these would not be expensive to actually implement, but reading /etc/ethers does not sound like a particularly useful feature, so for now I'm leaving them as stubs.
2013-06-25implement inet_lnaof, inet_netof, and inet_makeaddrRich Felker5-39/+55
also move all legacy inet_* functions into a single file to avoid wasting object file and compile time overhead on them. the added functions are legacy interfaces for working with classful ipv4 network addresses. they have no modern usefulness whatsoever, but some programs unconditionally use them anyway, and they're tiny.
2013-06-25add ether_aton[_r] and ether_ntoa[_r] functionsRich Felker1-0/+43
based on patch by Strake with minor stylistic changes, and combined into a single file. this patch remained open for a long time due to some question as to whether ether_aton would be better implemented in terms of sscanf, and it's time something was committed, so here it is.
2013-04-09getifaddrs: implement proper ipv6 netmasksrofl0r1-2/+11
2013-04-06getifaddrs: remove unused labelrofl0r1-1/+0
2013-04-05getifaddrs: use if_nameindex to enumerate interfacesrofl0r1-23/+9
2013-04-05getifaddrs: one less indent levelrofl0r1-30/+28
2013-04-05getifaddrs: less mallocrofl0r1-55/+52
2013-04-05add getifaddrsrofl0r1-0/+191
supports ipv4 and ipv6, but not the "extended" usage where usage statistics and other info are assigned to ifa_data members of duplicate entries with AF_PACKET family.
2013-04-04implement dn_skipname (legacy resolver function)Rich Felker1-0/+12
2013-02-02dynamically allocate storage for gethostby* buffersRich Felker2-10/+32
this change shaves ~1k off libc.so bss size, and also avoids hard errors in the case where the static buffer was not large enough to hold the result. this whole framework is really ugly and might should be replaced or at least heavily overhauled when some changes/factorizations are made to getaddrinfo internals in the future.
2013-02-02fix blank ai_canonname from getaddrinfo for non-CNAMEsRich Felker1-1/+1
2013-02-02fix memory leak due to double call to getaddrinfo in gethostbyname*Rich Felker1-1/+0
2013-02-02fix error returns in gethostby*_r functionsRich Felker2-17/+10
they're supposed to return an error code rather than using errno.
2012-12-19add inet_network (required for wine)rofl0r1-0/+11
2012-11-05improve SOCK_NONBLOCK/SOCK_CLOEXEC fallback codeRich Felker1-1/+2
checking for EINVAL should be sufficient, but qemu user emulation returns EPROTONOSUPPORT in some of the failure cases, and it seems conceivable that other kernels doing linux-emulation could make the same mistake. since DNS lookups and other important code might break if the fallback does not get invoked, be extra careful and check for either error. note that it's important NOT to perform the fallback code on other errors such as resource-exhaustion cases, since the fallback is not atomic and will lead to file-descriptor leaks in multi-threaded programs that use exec. the fallback code is only "safe" to run when the initial failure is caused by the application's choice of arguments, not the system state.
2012-09-29fix some more O_CLOEXEC/SOCK_CLOEXEC issuesRich Felker1-3/+1
2012-09-29move accept4, dup3, and pipe2 to non-linux-specific locationsRich Felker1-0/+9
these interfaces have been adopted by the Austin Group for inclusion in the next version of POSIX.
2012-09-29emulate SOCK_CLOEXEC and SOCK_NONBLOCK for old (pre-2.6.27) kernelsRich Felker1-1/+14
also update syslog to use SOCK_CLOEXEC rather than separate fcntl step, to make it safe in multithreaded programs that run external programs. emulation is not atomic; it could be made atomic by holding a lock on forking during the operation, but this seems like overkill. my goal is not to achieve perfect behavior on old kernels (which have plenty of other imperfect behavior already) but to avoid catastrophic breakage in (1) syslog, which would give no output on old kernels with the change to use SOCK_CLOEXEC, and (2) programs built on a new kernel where configure scripts detected a working SOCK_CLOEXEC, which later get run on older kernels (they may otherwise fail to work completely).
2012-09-22fix getaddrinfo to accept port 0 (zero)Rich Felker1-2/+2
new behavior can be summarized as: inputs that parse completely as a decimal number are treated as one, and rejected only if the result is out of 16-bit range. inputs that do not parse as a decimal number (where strtoul leaves anything left over in the input) are searched in /etc/services.
2012-09-06use restrict everywhere it's required by c99 and/or posix 2008Rich Felker9-11/+11
to deal with the fact that the public headers may be used with pre-c99 compilers, __restrict is used in place of restrict, and defined appropriately for any supported compiler. we also avoid the form [restrict] since older versions of gcc rejected it due to a bug in the original c99 standard, and instead use the form *restrict.
2012-07-22remove scanf dependency from getaddrinfo /etc/services supportRich Felker1-5/+4
2012-07-22getaddrinfo /etc/services lookup supportRich Felker1-3/+16
2012-07-22make getservby*_r return error code rather than -1 (and using errno)Rich Felker2-19/+35
untested but should be correct..
2012-07-21fix logic error for skipping failed interfaces in if_nameindexRich Felker1-8/+7
2012-07-14fix getservby*() with null pointer for protocol argumentRich Felker2-0/+8
not sure this is the best fix but it should work
2012-07-12workaround another sendmsg kernel bug on 64-bit machinesRich Felker1-0/+13
the kernel wrongly expects the cmsg length field to be size_t instead of socklen_t. in order to work around the issue, we have to impose a length limit and copy to a local buffer. the length limit should be more than sufficient for any real-world use; these headers are only used for passing file descriptors and permissions between processes over unix sockets.
2012-05-16fix misplaced semicolon in preprocessor directive (#undef h_errno)Rich Felker1-1/+1
2012-05-12use __h_errno_location for h_errnoRich Felker2-0/+9
we do not bother making h_errno thread-local since the only interfaces that use it are inherently non-thread-safe. but still use the potentially-thread-local ABI to access it just to avoid lock-in.
2012-04-01improve name lookup performance in corner casesRich Felker2-2/+2
the buffer in getaddrinfo really only matters when /etc/hosts is huge, but in that case, the huge number of syscalls resulting from a tiny buffer would seriously impact the performance of every name lookup. the buffer in __dns.c has also been enlarged a bit so that typical resolv.conf files will fit fully in the buffer. there's no need to make it so large as to dominate the syscall overhead for large files, because resolv.conf should never be large.
2012-02-23fix for previous incorrect fix of cancellation in dns lookupsRich Felker1-3/+4
uninitialized file descriptor was being closed on return, causing stdin to be closed in many cases.
2012-02-11fix default nameserver when resolv.conf doesn't existRich Felker1-1/+2
2012-02-11fix illegal goto out of cleanup context in dns lookupsRich Felker1-3/+3
2011-09-21make dns lookups (and thus getaddrinfo) cancellableRich Felker1-4/+11
2011-09-21use poll rather than select in dns lookups (also clock_gettime)Rich Felker1-12/+10
if the file descriptor resource limit has been increased past FD_SETSIZE, this is actually a security issue; we could write past the end of the fd_set object. using poll makes it a non-issue, and simplifies the code at the same time. also, use clock_gettime instead of gettimeofday, for reduced bloat and better entropy.
2011-09-13remove some stray trailing space charactersRich Felker2-2/+2
2011-08-03implement if_nameindex and if_freenameindexRich Felker2-0/+65
2011-08-01fix wrong messages in gai_strerrorRich Felker1-0/+2
i had missed the fact that a couple values were unassigned...
2011-08-01port numbers should always be interpreted as decimalRich Felker1-1/+1
per POSIX and RFC 3493: If the specified address family is AF_INET, AF_INET6, or AF_UNSPEC, the service can be specified as a string specifying a decimal port number. 021 is a valid decimal number, therefore, interpreting it as octal seems to be non-conformant.
2011-07-12"implement" getnetbyaddr and getnetbynameRich Felker1-0/+12
these are useless legacy functions but some old software contains cruft that expects them to exist...
2011-06-30res_search symbol, aliased to res_query for now (better than nothing)Rich Felker1-0/+3
2011-04-25fix bug in ipv6 parsing that prevented parsing a lone "::"Rich Felker1-4/+1
2011-04-25ipv6 parsing code (formerly dummied-out)Rich Felker2-8/+62
2011-04-21fix bogus return values for inet_ptonRich Felker1-2/+2