Module Name: src
Committed By: pgoyette
Date: Mon Apr 15 10:53:17 UTC 2019
Modified Files:
src/sys/compat/common: kern_uipc_socket_50.c
src/sys/kern: uipc_socket.c
src/sys/sys: compat_stub.h
Log Message:
Clean up this mess and simplify, so that all the socket options get
handled correctly whether or not the compat_50 module is loaded.
To generate a diff of this commit:
cvs rdiff -u -r1.1 -r1.2 src/sys/compat/common/kern_uipc_socket_50.c
cvs rdiff -u -r1.277 -r1.278 src/sys/kern/uipc_socket.c
cvs rdiff -u -r1.12 -r1.13 src/sys/sys/compat_stub.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/compat/common/kern_uipc_socket_50.c
diff -u src/sys/compat/common/kern_uipc_socket_50.c:1.1 src/sys/compat/common/kern_uipc_socket_50.c:1.2
--- src/sys/compat/common/kern_uipc_socket_50.c:1.1 Mon Apr 15 02:07:11 2019
+++ src/sys/compat/common/kern_uipc_socket_50.c Mon Apr 15 10:53:17 2019
@@ -1,4 +1,4 @@
-/* $NetBSD: kern_uipc_socket_50.c,v 1.1 2019/04/15 02:07:11 pgoyette Exp $ */
+/* $NetBSD: kern_uipc_socket_50.c,v 1.2 2019/04/15 10:53:17 pgoyette Exp $ */
/*
* Copyright (c) 2002, 2007, 2008, 2009 The NetBSD Foundation, Inc.
@@ -101,7 +101,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: kern_uipc_socket_50.c,v 1.1 2019/04/15 02:07:11 pgoyette Exp $");
+__KERNEL_RCSID(0, "$NetBSD: kern_uipc_socket_50.c,v 1.2 2019/04/15 10:53:17 pgoyette Exp $");
#if defined(_KERNEL_OPT)
#include "opt_compat_netbsd.h"
@@ -121,8 +121,7 @@ __KERNEL_RCSID(0, "$NetBSD: kern_uipc_so
#include <compat/common/compat_mod.h>
static int
-uipc_socket_50_getopt1(int opt, struct socket *so, struct sockopt *sopt,
- struct timeval *tv)
+uipc_socket_50_getopt1(int opt, struct socket *so, struct sockopt *sopt)
{
int optval, error;
struct timeval50 otv;
@@ -151,27 +150,46 @@ uipc_socket_50_getopt1(int opt, struct s
}
static int
-uipc_socket_50_setopt1(int opt, struct socket *so, const struct sockopt *sopt,
- struct timeval *tv)
+uipc_socket_50_setopt1(int opt, struct socket *so, const struct sockopt *sopt)
{
int optval, error;
struct timeval50 otv;
+ struct timeval tv;
switch (opt) {
case SO_OSNDTIMEO:
case SO_ORCVTIMEO:
+ solock(so);
+
error = sockopt_get(sopt, &otv, sizeof(otv));
- if (error) {
- solock(so);
+ if (error)
+ break;
+
+ timeval50_to_timeval(&otv, &tv);
+
+ /* Code duplicated from sys/kern/uipc_socket.c */
+ if (tv.tv_sec < 0 || tv.tv_usec < 0 || tv.tv_usec >= 1000000) {
+ error = EDOM;
+ break;
+ }
+ if (tv.tv_sec > (INT_MAX - tv.tv_usec / tick) / hz) {
+ error = EDOM;
break;
}
- timeval50_to_timeval(&otv, tv);
- opt = opt == SO_OSNDTIMEO ? SO_SNDTIMEO : SO_RCVTIMEO;
- /*
- * Processing will continue as for SO_SNDTIMEO
- * and SO_RCVTIMEO, using the new-format tv
- */
+
+ optval = tv.tv_sec * hz + tv.tv_usec / tick;
+ if (optval == 0 && tv.tv_usec != 0)
+ optval = 1;
+
+ switch (opt) {
+ case SO_OSNDTIMEO:
+ so->so_snd.sb_timeo = optval;
+ break;
+ case SO_ORCVTIMEO:
+ so->so_rcv.sb_timeo = optval;
+ break;
+ }
break;
case SO_OTIMESTAMP:
Index: src/sys/kern/uipc_socket.c
diff -u src/sys/kern/uipc_socket.c:1.277 src/sys/kern/uipc_socket.c:1.278
--- src/sys/kern/uipc_socket.c:1.277 Mon Apr 15 03:58:29 2019
+++ src/sys/kern/uipc_socket.c Mon Apr 15 10:53:17 2019
@@ -1,4 +1,4 @@
-/* $NetBSD: uipc_socket.c,v 1.277 2019/04/15 03:58:29 pgoyette Exp $ */
+/* $NetBSD: uipc_socket.c,v 1.278 2019/04/15 10:53:17 pgoyette Exp $ */
/*
* Copyright (c) 2002, 2007, 2008, 2009 The NetBSD Foundation, Inc.
@@ -71,7 +71,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: uipc_socket.c,v 1.277 2019/04/15 03:58:29 pgoyette Exp $");
+__KERNEL_RCSID(0, "$NetBSD: uipc_socket.c,v 1.278 2019/04/15 10:53:17 pgoyette Exp $");
#ifdef _KERNEL_OPT
#include "opt_compat_netbsd.h"
@@ -1713,15 +1713,6 @@ sosetopt1(struct socket *so, const struc
opt = sopt->sopt_name;
- MODULE_HOOK_CALL(uipc_socket_50_setopt1_hook, (opt, so, sopt, &tv),
- enosys(), error);
- if (error == EPASSTHROUGH)
- error = EINVAL;
- else if (error && error != ENOSYS) {
- KASSERT(solocked(so));
- return error;
- }
-
switch (opt) {
case SO_ACCEPTFILTER:
@@ -1822,19 +1813,10 @@ sosetopt1(struct socket *so, const struc
}
break;
- case SO_OSNDTIMEO:
- case SO_ORCVTIMEO:
- if (error == ENOSYS) {
- error = EINVAL;
- solock(so);
- break;
- }
- /* FALLTHROUGH */
case SO_SNDTIMEO:
case SO_RCVTIMEO:
- if (error)
- error = sockopt_get(sopt, &tv, sizeof(tv));
solock(so);
+ error = sockopt_get(sopt, &tv, sizeof(tv));
if (error)
break;
@@ -1852,11 +1834,9 @@ sosetopt1(struct socket *so, const struc
optval = 1;
switch (opt) {
- case SO_OSNDTIMEO:
case SO_SNDTIMEO:
so->so_snd.sb_timeo = optval;
break;
- case SO_ORCVTIMEO:
case SO_RCVTIMEO:
so->so_rcv.sb_timeo = optval;
break;
@@ -1864,10 +1844,12 @@ sosetopt1(struct socket *so, const struc
break;
default:
- if (error == 0)
- break;
- solock(so);
- error = ENOPROTOOPT;
+ MODULE_HOOK_CALL(uipc_socket_50_setopt1_hook,
+ (opt, so, sopt), enosys(), error);
+ if (error == ENOSYS || error == EPASSTHROUGH) {
+ solock(so);
+ error = ENOPROTOOPT;
+ }
break;
}
KASSERT(solocked(so));
@@ -2006,7 +1988,7 @@ sogetopt1(struct socket *so, struct sock
default:
MODULE_HOOK_CALL(uipc_socket_50_getopt1_hook,
- (opt, so, sopt, &tv), enosys(), error);
+ (opt, so, sopt), enosys(), error);
if (error)
error = ENOPROTOOPT;
break;
Index: src/sys/sys/compat_stub.h
diff -u src/sys/sys/compat_stub.h:1.12 src/sys/sys/compat_stub.h:1.13
--- src/sys/sys/compat_stub.h:1.12 Mon Apr 15 02:07:11 2019
+++ src/sys/sys/compat_stub.h Mon Apr 15 10:53:17 2019
@@ -1,4 +1,4 @@
-/* $NetBSD: compat_stub.h,v 1.12 2019/04/15 02:07:11 pgoyette Exp $ */
+/* $NetBSD: compat_stub.h,v 1.13 2019/04/15 10:53:17 pgoyette Exp $ */
/*-
* Copyright (c) 2018 The NetBSD Foundation, Inc.
@@ -224,13 +224,12 @@ MODULE_HOOK(uipc_syscalls_40_hook, int,
* uipc_socket_50 compatibility
*/
struct sockopt;
-struct timeval;
struct mbuf;
MODULE_HOOK(uipc_socket_50_setopt1_hook, int,
- (int, struct socket *, const struct sockopt *, struct timeval *));
+ (int, struct socket *, const struct sockopt *));
MODULE_HOOK(uipc_socket_50_getopt1_hook, int,
- (int, struct socket *, struct sockopt *, struct timeval *));
+ (int, struct socket *, struct sockopt *));
MODULE_HOOK(uipc_socket_50_sbts_hook, int, (int, struct mbuf **));
/*