diff options
author | 2017-06-27 12:02:43 +0000 | |
---|---|---|
committer | 2017-06-27 12:02:43 +0000 | |
commit | 2f18f0241708f39e790db0193c6527f977a05a4e (patch) | |
tree | 4e9dc0341efc37006abaaf3099c764d496036fcf /sys/kern/uipc_socket.c | |
parent | remove -DSw; the useful parts are now covered by mandoc; (diff) | |
download | wireguard-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/uipc_socket.c')
-rw-r--r-- | sys/kern/uipc_socket.c | 8 |
1 files changed, 7 insertions, 1 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; |