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 **)); /*