Module Name:    src
Committed By:   martin
Date:           Sun Mar 10 13:46:04 UTC 2024

Modified Files:
        src/lib/libc/net [netbsd-9]: getnameinfo.c

Log Message:
Pull up following revision(s) (requested by riastradh in ticket #1806):

        lib/libc/net/getnameinfo.c: revision 1.60

PR/57609: Carl Engvall: Add salen checks but accept larger sizes
(upto sockaddr_storage)


To generate a diff of this commit:
cvs rdiff -u -r1.59 -r1.59.18.1 src/lib/libc/net/getnameinfo.c

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/lib/libc/net/getnameinfo.c
diff -u src/lib/libc/net/getnameinfo.c:1.59 src/lib/libc/net/getnameinfo.c:1.59.18.1
--- src/lib/libc/net/getnameinfo.c:1.59	Tue Sep 22 16:15:08 2015
+++ src/lib/libc/net/getnameinfo.c	Sun Mar 10 13:46:04 2024
@@ -1,4 +1,4 @@
-/*	$NetBSD: getnameinfo.c,v 1.59 2015/09/22 16:15:08 christos Exp $	*/
+/*	$NetBSD: getnameinfo.c,v 1.59.18.1 2024/03/10 13:46:04 martin Exp $	*/
 /*	$KAME: getnameinfo.c,v 1.45 2000/09/25 22:43:56 itojun Exp $	*/
 
 /*
@@ -47,7 +47,7 @@
 
 #include <sys/cdefs.h>
 #if defined(LIBC_SCCS) && !defined(lint)
-__RCSID("$NetBSD: getnameinfo.c,v 1.59 2015/09/22 16:15:08 christos Exp $");
+__RCSID("$NetBSD: getnameinfo.c,v 1.59.18.1 2024/03/10 13:46:04 martin Exp $");
 #endif /* LIBC_SCCS and not lint */
 
 #ifndef RUMP_ACTION
@@ -128,6 +128,13 @@ getnameinfo(const struct sockaddr *sa, s
 	int flags)
 {
 
+	/*      
+	 * getnameinfo() accepts an salen of sizeof(struct sockaddr_storage)
+	 * at maximum as shown in RFC 4038 Sec.6.2.3.
+	 */     
+	if (salen > sizeof(struct sockaddr_storage))
+		return EAI_FAMILY;
+
 	switch (sa->sa_family) {
 	case AF_APPLETALK:
 		return getnameinfo_atalk(sa, salen, host, hostlen,
@@ -220,6 +227,9 @@ getnameinfo_local(const struct sockaddr 
 	const struct sockaddr_un *sun =
 	    (const struct sockaddr_un *)(const void *)sa;
 
+        if (salen <= sizeof(*sun) - sizeof(sun->sun_path))
+		return EAI_FAMILY;
+
 	if (serv != NULL && servlen > 0)
 		serv[0] = '\0';
 
@@ -266,8 +276,8 @@ getnameinfo_inet(const struct sockaddr *
 	return EAI_FAMILY;
 
  found:
-	if (salen != afd->a_socklen)
-		return EAI_FAIL;
+	if (salen < afd->a_socklen)
+		return EAI_FAMILY;
 
 	/* network byte order */
 	port = ((const struct sockinet *)(const void *)sa)->si_port;
@@ -544,6 +554,9 @@ getnameinfo_link(const struct sockaddr *
 	const struct ieee1394_hwaddr *iha;
 	int n;
 
+        if (salen <= sizeof(*sdl) - sizeof(sdl->sdl_data))
+		return EAI_FAMILY;
+
 	if (serv != NULL && servlen > 0)
 		*serv = '\0';
 

Reply via email to