diff mbox series

[uclibc-ng-devel] inet: gethostid: only accept v4 addresses

Message ID 20220601171723.qnsmyw4bkw64ajhk@tarta.nabijaczleweli.xyz
State Accepted
Headers show
Series [uclibc-ng-devel] inet: gethostid: only accept v4 addresses | expand

Commit Message

Ahelenia Ziemiańska June 1, 2022, 5:17 p.m. UTC
getaddrinfo() returns addresses from, at least, ip(7) and ipv6(7),
but _addr() always uses sin_addr from struct sockaddr_in;
we're saved from wild unsoundness (or incompatibility)
by virtue of struct sockaddr_in6 having an always-0 u32 sin6_flowinfo
at the same offset, so we end up returning 0 anyway,
but in a round-about and definitely unintended way

Instead, limit the request to AF_INET, and fall through to the end
early, returning the default id=0
---

Comments

Waldemar Brodkorb June 20, 2022, 10:19 a.m. UTC | #1
Hi,
наб wrote,

> getaddrinfo() returns addresses from, at least, ip(7) and ipv6(7),
> but _addr() always uses sin_addr from struct sockaddr_in;
> we're saved from wild unsoundness (or incompatibility)
> by virtue of struct sockaddr_in6 having an always-0 u32 sin6_flowinfo
> at the same offset, so we end up returning 0 anyway,
> but in a round-about and definitely unintended way
> 
> Instead, limit the request to AF_INET, and fall through to the end
> early, returning the default id=0
> 
> Signed-off-by: Ahelenia Ziemiańska <nabijaczleweli@nabijaczleweli.xyz>

Applied and pushed, thx
 Waldemar
diff mbox series

Patch

diff -ur uClibc-ng-1.0.41.orig/libc/inet/hostid.c uClibc-ng-1.0.41/libc/inet/hostid.c
--- uClibc-ng-1.0.41.orig/libc/inet/hostid.c	2022-05-20 17:07:47.000000000 +0200
+++ uClibc-ng-1.0.41/libc/inet/hostid.c	2022-06-01 19:09:21.971253011 +0200
@@ -61,8 +61,7 @@ 
 	 *						Mitch
 	 */
 	if (gethostname(host, HOST_NAME_MAX) >= 0 && *host) {
-		struct addrinfo hints, *results, *addr;
-		memset(&hints, 0, sizeof(struct addrinfo));
+		struct addrinfo hints = {.ai_family = AF_INET}, *results, *addr;
 		if (!getaddrinfo(host, NULL, &hints, &results)) {
 			for (addr = results; addr; addr = results->ai_next) {
 				/* Just so it doesn't look exactly like the