Index | Thread | Search

From:
YASUOKA Masahiko <yasuoka@openbsd.org>
Subject:
enclose IPv6 address in bracket
To:
tobhe@openbsd.org
Cc:
tech@openbsd.org
Date:
Mon, 01 Jul 2024 14:55:48 +0900

Download raw body.

Thread
Hi,

When iked(8) represents an IPv6 address with a port number, the port
part might be interpreted as a last 2 octets of the address.

I'd like to enclose the address in bracket.

ok?

Index: sbin/iked/util.c
===================================================================
RCS file: /cvs/src/sbin/iked/util.c,v
diff -u -p -r1.44 util.c
--- sbin/iked/util.c	3 Feb 2024 00:38:08 -0000	1.44
+++ sbin/iked/util.c	1 Jul 2024 05:39:58 -0000
@@ -644,16 +644,16 @@ prefixlen2mask6(uint8_t prefixlen, uint3
 const char *
 print_addr(void *addr)
 {
-	static char	 sbuf[IKED_CYCLE_BUFFERS][NI_MAXHOST + 7];
+	static char	 sbuf[IKED_CYCLE_BUFFERS][NI_MAXHOST + 9];
 	static int	 idx;
 	struct sockaddr	*sa = addr;
-	char		*buf;
-	size_t		 len;
+	char		*buf, *hbuf;
+	size_t		 len, hlen;
 	char		 pbuf[7];
 	in_port_t	 port;
 
-	buf = sbuf[idx];
-	len = sizeof(sbuf[idx]);
+	hbuf = buf = sbuf[idx];
+	hlen = len = sizeof(sbuf[idx]);
 	if (++idx >= IKED_CYCLE_BUFFERS)
 		idx = 0;
 
@@ -662,13 +662,21 @@ print_addr(void *addr)
 		return (buf);
 	}
 
+	if ((port = socket_getport(sa)) != 0 && sa->sa_family == AF_INET6) {
+		/* surround [] */
+		*(hbuf++) = '[';
+		hlen--;
+	}
+
 	if (getnameinfo(sa, sa->sa_len,
-	    buf, len, NULL, 0, NI_NUMERICHOST) != 0) {
+	    hbuf, hlen, NULL, 0, NI_NUMERICHOST) != 0) {
 		strlcpy(buf, "unknown", len);
 		return (buf);
 	}
 
-	if ((port = socket_getport(sa)) != 0) {
+	if (port != 0) {
+		if (sa->sa_family == AF_INET6)
+			(void)strlcat(buf, "]", len);
 		snprintf(pbuf, sizeof(pbuf), ":%d", port);
 		(void)strlcat(buf, pbuf, len);
 	}