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