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';