Module Name: src
Committed By: christos
Date: Sat Jul 1 16:59:12 UTC 2017
Modified Files:
src/sys/kern: uipc_domain.c
src/sys/net: rtsock.c
src/sys/sys: socket.h
Log Message:
put the code that returns the sizeof the socket by family in one place.
To generate a diff of this commit:
cvs rdiff -u -r1.96 -r1.97 src/sys/kern/uipc_domain.c
cvs rdiff -u -r1.226 -r1.227 src/sys/net/rtsock.c
cvs rdiff -u -r1.122 -r1.123 src/sys/sys/socket.h
Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.
Modified files:
Index: src/sys/kern/uipc_domain.c
diff -u src/sys/kern/uipc_domain.c:1.96 src/sys/kern/uipc_domain.c:1.97
--- src/sys/kern/uipc_domain.c:1.96 Tue Dec 2 14:45:58 2014
+++ src/sys/kern/uipc_domain.c Sat Jul 1 12:59:12 2017
@@ -1,4 +1,4 @@
-/* $NetBSD: uipc_domain.c,v 1.96 2014/12/02 19:45:58 christos Exp $ */
+/* $NetBSD: uipc_domain.c,v 1.97 2017/07/01 16:59:12 christos Exp $ */
/*
* Copyright (c) 1982, 1986, 1993
@@ -32,7 +32,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: uipc_domain.c,v 1.96 2014/12/02 19:45:58 christos Exp $");
+__KERNEL_RCSID(0, "$NetBSD: uipc_domain.c,v 1.97 2017/07/01 16:59:12 christos Exp $");
#include <sys/param.h>
#include <sys/socket.h>
@@ -228,7 +228,7 @@ sockaddr_const_addr(const struct sockadd
}
const struct sockaddr *
-sockaddr_any_by_family(int family)
+sockaddr_any_by_family(sa_family_t family)
{
const struct domain *dom;
@@ -255,43 +255,41 @@ sockaddr_anyaddr(const struct sockaddr *
return sockaddr_const_addr(any, slenp);
}
-#ifdef DIAGNOSTIC
-static void
-sockaddr_checklen(const struct sockaddr *sa)
+socklen_t
+sockaddr_getsize_by_family(sa_family_t af)
{
- socklen_t len = 0;
- switch (sa->sa_family) {
+ switch (af) {
case AF_INET:
- len = sizeof(struct sockaddr_in);
- break;
+ return sizeof(struct sockaddr_in);
case AF_INET6:
- len = sizeof(struct sockaddr_in6);
- break;
+ return sizeof(struct sockaddr_in6);
case AF_UNIX:
- len = sizeof(struct sockaddr_un);
- break;
+ return sizeof(struct sockaddr_un);
case AF_LINK:
- len = sizeof(struct sockaddr_dl);
- // As long as it is not 0...
- if (sa->sa_len != 0)
- return;
- break;
+ return sizeof(struct sockaddr_dl);
case AF_APPLETALK:
- len = sizeof(struct sockaddr_at);
- break;
+ return sizeof(struct sockaddr_at);
default:
- printf("%s: Unhandled af=%hhu socklen=%hhu\n", __func__,
- sa->sa_family, sa->sa_len);
- return;
- }
- if (len != sa->sa_len) {
- char buf[512];
- sockaddr_format(sa, buf, sizeof(buf));
- printf("%s: %p bad len af=%hhu socklen=%hhu len=%u [%s]\n",
- __func__, sa, sa->sa_family, sa->sa_len,
- (unsigned)len, buf);
+#ifdef DIAGNOSTIC
+ printf("%s: Unhandled address family=%hhu\n", __func__, af);
+#endif
+ return 0;
}
}
+
+#ifdef DIAGNOSTIC
+static void
+sockaddr_checklen(const struct sockaddr *sa)
+{
+ socklen_t len = sockaddr_getsize_by_family(sa->sa_family);
+ if (len == 0 || len == sa->sa_len)
+ return;
+
+ char buf[512];
+ sockaddr_format(sa, buf, sizeof(buf));
+ printf("%s: %p bad len af=%hhu socklen=%hhu len=%u [%s]\n",
+ __func__, sa, sa->sa_family, sa->sa_len, (unsigned)len, buf);
+}
#else
#define sockaddr_checklen(sa) ((void)0)
#endif
Index: src/sys/net/rtsock.c
diff -u src/sys/net/rtsock.c:1.226 src/sys/net/rtsock.c:1.227
--- src/sys/net/rtsock.c:1.226 Fri Jun 30 14:28:31 2017
+++ src/sys/net/rtsock.c Sat Jul 1 12:59:12 2017
@@ -1,4 +1,4 @@
-/* $NetBSD: rtsock.c,v 1.226 2017/06/30 18:28:31 christos Exp $ */
+/* $NetBSD: rtsock.c,v 1.227 2017/07/01 16:59:12 christos Exp $ */
/*
* Copyright (C) 1995, 1996, 1997, and 1998 WIDE Project.
@@ -61,7 +61,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: rtsock.c,v 1.226 2017/06/30 18:28:31 christos Exp $");
+__KERNEL_RCSID(0, "$NetBSD: rtsock.c,v 1.227 2017/07/01 16:59:12 christos Exp $");
#ifdef _KERNEL_OPT
#include "opt_inet.h"
@@ -721,24 +721,6 @@ out:
return error;
}
-static socklen_t
-sa_addrlen(const struct sockaddr *sa)
-{
-
- switch (sa->sa_family) {
-#ifdef INET
- case AF_INET:
- return sizeof(struct sockaddr_in);
-#endif
-#ifdef INET6
- case AF_INET6:
- return sizeof(struct sockaddr_in6);
-#endif
- default:
- return 0;
- }
-}
-
/*ARGSUSED*/
int
COMPATNAME(route_output)(struct mbuf *m, struct socket *so)
@@ -819,8 +801,10 @@ COMPATNAME(route_output)(struct mbuf *m,
* (padded with 0's). We keep the original length of the sockaddr.
*/
if (info.rti_info[RTAX_NETMASK]) {
- socklen_t sa_len = sa_addrlen(info.rti_info[RTAX_NETMASK]);
- socklen_t masklen = info.rti_info[RTAX_NETMASK]->sa_len;
+ socklen_t sa_len = sockaddr_getsize_by_family(
+ info.rti_info[RTAX_NETMASK]->sa_family);
+ socklen_t masklen = sockaddr_getlen(
+ info.rti_info[RTAX_NETMASK]);
if (sa_len != 0 && sa_len > masklen) {
KASSERT(sa_len <= sizeof(netmask));
memcpy(&netmask, info.rti_info[RTAX_NETMASK], masklen);
Index: src/sys/sys/socket.h
diff -u src/sys/sys/socket.h:1.122 src/sys/sys/socket.h:1.123
--- src/sys/sys/socket.h:1.122 Sat May 27 17:02:56 2017
+++ src/sys/sys/socket.h Sat Jul 1 12:59:12 2017
@@ -1,4 +1,4 @@
-/* $NetBSD: socket.h,v 1.122 2017/05/27 21:02:56 bouyer Exp $ */
+/* $NetBSD: socket.h,v 1.123 2017/07/01 16:59:12 christos Exp $ */
/*
* Copyright (C) 1995, 1996, 1997, and 1998 WIDE Project.
@@ -625,6 +625,7 @@ sockaddr_getlen(const struct sockaddr *s
}
__BEGIN_DECLS
+socklen_t sockaddr_getsize_by_family(sa_family_t);
struct sockaddr *sockaddr_copy(struct sockaddr *, socklen_t,
const struct sockaddr *);
struct sockaddr *sockaddr_externalize(struct sockaddr *, socklen_t,
@@ -633,7 +634,7 @@ struct sockaddr *sockaddr_alloc(sa_famil
const void *sockaddr_const_addr(const struct sockaddr *, socklen_t *);
void *sockaddr_addr(struct sockaddr *, socklen_t *);
const struct sockaddr *sockaddr_any(const struct sockaddr *);
-const struct sockaddr *sockaddr_any_by_family(int);
+const struct sockaddr *sockaddr_any_by_family(sa_family_t);
const void *sockaddr_anyaddr(const struct sockaddr *, socklen_t *);
int sockaddr_cmp(const struct sockaddr *, const struct sockaddr *);
struct sockaddr *sockaddr_dup(const struct sockaddr *, int);