summaryrefslogtreecommitdiffstats
path: root/sys/kern
diff options
context:
space:
mode:
authormpi <mpi@openbsd.org>2017-06-27 12:02:43 +0000
committermpi <mpi@openbsd.org>2017-06-27 12:02:43 +0000
commit2f18f0241708f39e790db0193c6527f977a05a4e (patch)
tree4e9dc0341efc37006abaaf3099c764d496036fcf /sys/kern
parentremove -DSw; the useful parts are now covered by mandoc; (diff)
downloadwireguard-openbsd-2f18f0241708f39e790db0193c6527f977a05a4e.tar.xz
wireguard-openbsd-2f18f0241708f39e790db0193c6527f977a05a4e.zip
Add missing solock()/sounlock() dances around sbreserve().
While here document an abuse of parent socket's lock. Problem reported by krw@, analysis and ok bluhm@
Diffstat (limited to 'sys/kern')
-rw-r--r--sys/kern/uipc_socket.c8
-rw-r--r--sys/kern/uipc_socket2.c7
2 files changed, 13 insertions, 2 deletions
diff --git a/sys/kern/uipc_socket.c b/sys/kern/uipc_socket.c
index dfdc62b78b4..c6fbdc7bc2f 100644
--- a/sys/kern/uipc_socket.c
+++ b/sys/kern/uipc_socket.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: uipc_socket.c,v 1.189 2017/06/26 09:32:31 mpi Exp $ */
+/* $OpenBSD: uipc_socket.c,v 1.190 2017/06/27 12:02:43 mpi Exp $ */
/* $NetBSD: uipc_socket.c,v 1.21 1996/02/04 02:17:52 christos Exp $ */
/*
@@ -1635,11 +1635,14 @@ sosetopt(struct socket *so, int level, int optname, struct mbuf *m0)
error = EINVAL;
goto bad;
}
+ s = solock(so);
if (sbcheckreserve(cnt, so->so_snd.sb_wat) ||
sbreserve(so, &so->so_snd, cnt)) {
+ sounlock(s);
error = ENOBUFS;
goto bad;
}
+ sounlock(s);
so->so_snd.sb_wat = cnt;
break;
@@ -1648,11 +1651,14 @@ sosetopt(struct socket *so, int level, int optname, struct mbuf *m0)
error = EINVAL;
goto bad;
}
+ s = solock(so);
if (sbcheckreserve(cnt, so->so_rcv.sb_wat) ||
sbreserve(so, &so->so_rcv, cnt)) {
+ sounlock(s);
error = ENOBUFS;
goto bad;
}
+ sounlock(s);
so->so_rcv.sb_wat = cnt;
break;
diff --git a/sys/kern/uipc_socket2.c b/sys/kern/uipc_socket2.c
index 65c5dd74f65..9619cbd3dc4 100644
--- a/sys/kern/uipc_socket2.c
+++ b/sys/kern/uipc_socket2.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: uipc_socket2.c,v 1.79 2017/06/26 09:32:31 mpi Exp $ */
+/* $OpenBSD: uipc_socket2.c,v 1.80 2017/06/27 12:02:43 mpi Exp $ */
/* $NetBSD: uipc_socket2.c,v 1.11 1996/02/04 02:17:55 christos Exp $ */
/*
@@ -148,6 +148,11 @@ sonewconn(struct socket *head, int connstatus)
struct socket *so;
int soqueue = connstatus ? 1 : 0;
+ /*
+ * XXXSMP as long as `so' and `head' share the same lock, we
+ * can call soreserve() and pr_attach() below w/o expliclitly
+ * locking `so'.
+ */
soassertlocked(head);
if (mclpools[0].pr_nout > mclpools[0].pr_hardlimit * 95 / 100)