Commit Graph
64 Commits
Author SHA1 Message Date
Rich Felker f9dd79c8d1 fix undefined strcpy call in inet_ntop
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-25 03:30:24 -04:00
Rich Felker 1cd417bdf1 make inet_ntop format v4-mapped ipv6 addresses properly
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-25 03:20:02 -04:00
Rich Felker f5dfb45f78 make getaddrinfo with AF_UNSPEC and null host return both IPv4 and v6
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-24 16:49:17 -04:00
Rich Felker 0716b10ac8 fix missing SOCK_CLOEXEC in various functions that use sockets internally 2013-07-09 00:40:17 -04:00
Rich Felker fbcd82040c add stubs for additional legacy ether.h functions
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-07-01 13:50:02 -04:00
Rich Felker e40f48a421 implement inet_lnaof, inet_netof, and inet_makeaddr
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-25 21:35:49 -04:00
Rich Felker 83966b369d add ether_aton[_r] and ether_ntoa[_r] functions
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-06-25 21:15:27 -04:00
rofl0r 9947ed5c20 getifaddrs: implement proper ipv6 netmasks 2013-04-09 16:52:13 +02:00
rofl0r 338cc31c4b getifaddrs: remove unused label 2013-04-06 00:04:52 +02:00
rofl0r 4af3ea789a getifaddrs: use if_nameindex to enumerate interfaces 2013-04-05 22:47:30 +02:00
rofl0r 69a1983872 getifaddrs: one less indent level 2013-04-05 22:08:03 +02:00
rofl0r c82f53f67c getifaddrs: less malloc 2013-04-05 22:06:35 +02:00
rofl0r 202db37a6f add getifaddrs
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-05 19:36:51 +02:00
Rich Felker b6f9941201 implement dn_skipname (legacy resolver function) 2013-04-04 22:36:30 -04:00
Rich Felker a47ad3ebce dynamically allocate storage for gethostby* buffers
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-02 02:07:38 -05:00
Rich Felker c0193550a0 fix blank ai_canonname from getaddrinfo for non-CNAMEs 2013-02-02 01:59:53 -05:00
Rich Felker b0302863a3 fix memory leak due to double call to getaddrinfo in gethostbyname* 2013-02-02 01:32:12 -05:00
Rich Felker 70b584bc94 fix error returns in gethostby*_r functions
they're supposed to return an error code rather than using errno.
2013-02-02 01:31:10 -05:00
rofl0r 36d7303878 add inet_network (required for wine) 2012-12-19 07:32:38 +01:00
Rich Felker e8a0b27a71 improve SOCK_NONBLOCK/SOCK_CLOEXEC fallback code
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-11-05 14:30:15 -05:00
Rich Felker f2d08cf755 fix some more O_CLOEXEC/SOCK_CLOEXEC issues 2012-09-29 17:59:50 -04:00
Rich Felker dc62790dee move accept4, dup3, and pipe2 to non-linux-specific locations
these interfaces have been adopted by the Austin Group for inclusion
in the next version of POSIX.
2012-09-29 17:40:42 -04:00
Rich Felker 79a5e73e51 emulate SOCK_CLOEXEC and SOCK_NONBLOCK for old (pre-2.6.27) kernels
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-29 17:36:27 -04:00
Rich Felker 4b49060da0 fix getaddrinfo to accept port 0 (zero)
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-22 16:19:06 -04:00
Rich Felker 400c5e5c83 use restrict everywhere it's required by c99 and/or posix 2008
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-09-06 22:44:55 -04:00
Rich Felker 845a5e69fa remove scanf dependency from getaddrinfo /etc/services support 2012-07-22 22:09:45 -04:00
Rich Felker efe72c5619 getaddrinfo /etc/services lookup support 2012-07-22 19:42:44 -04:00
Rich Felker 75fff40b9b make getservby*_r return error code rather than -1 (and using errno)
untested but should be correct..
2012-07-22 18:49:49 -04:00
Rich Felker 68c5822367 fix logic error for skipping failed interfaces in if_nameindex 2012-07-21 17:56:48 -04:00
Rich Felker 06650b9684 fix getservby*() with null pointer for protocol argument
not sure this is the best fix but it should work
2012-07-14 20:16:23 -04:00
Rich Felker 96107564e2 workaround another sendmsg kernel bug on 64-bit machines
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-07-12 21:37:54 -04:00
Rich Felker 01e94c4623 fix misplaced semicolon in preprocessor directive (#undef h_errno) 2012-05-16 20:14:30 -04:00
Rich Felker e68c51ac46 use __h_errno_location for h_errno
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-05-12 23:45:07 -04:00
Rich Felker 4f346b08b3 improve name lookup performance in corner cases
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-04-01 23:22:16 -04:00
Rich Felker 56ddcc7208 fix for previous incorrect fix of cancellation in dns lookups
uninitialized file descriptor was being closed on return, causing
stdin to be closed in many cases.
2012-02-23 13:07:20 -05:00
Rich Felker 88d84b7cc8 fix default nameserver when resolv.conf doesn't exist 2012-02-11 00:06:32 -05:00
Rich Felker f42bad9ccb fix illegal goto out of cleanup context in dns lookups 2012-02-11 00:05:58 -05:00
Rich Felker 12d547b262 make dns lookups (and thus getaddrinfo) cancellable 2011-09-21 23:27:17 -04:00
Rich Felker bf027ca5e0 use poll rather than select in dns lookups (also clock_gettime)
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-21 23:17:45 -04:00
Rich Felker 28af39fe42 remove some stray trailing space characters 2011-09-13 09:53:41 -04:00
Rich Felker fc0ecd35d8 implement if_nameindex and if_freenameindex 2011-08-03 12:13:13 -04:00
Rich Felker 88798393ca fix wrong messages in gai_strerror
i had missed the fact that a couple values were unassigned...
2011-08-01 00:31:15 -04:00
Rich Felker f4e8e64b82 port numbers should always be interpreted as decimal
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-08-01 00:11:25 -04:00
Rich Felker c3c5e88c31 "implement" getnetbyaddr and getnetbyname
these are useless legacy functions but some old software contains
cruft that expects them to exist...
2011-07-12 02:52:06 -04:00
Rich Felker e936e4612f res_search symbol, aliased to res_query for now (better than nothing) 2011-06-30 23:12:07 -04:00
Rich Felker 3486365e95 fix bug in ipv6 parsing that prevented parsing a lone "::" 2011-04-25 17:49:21 -04:00
Rich Felker 34d81974d3 ipv6 parsing code (formerly dummied-out) 2011-04-25 17:04:40 -04:00
Rich Felker 31f014e0a7 fix bogus return values for inet_pton 2011-04-21 16:57:00 -04:00
Rich Felker f1ac8a28d8 disallow blank strings as service or host name 2011-04-20 20:02:35 -04:00
Rich Felker d4b5d6e981 fix bugs in ipv4 parsing 2011-04-20 20:00:59 -04:00