diff options
author | Peter Wemm <peter@FreeBSD.org> | 1997-06-27 15:28:54 +0000 |
---|---|---|
committer | Peter Wemm <peter@FreeBSD.org> | 1997-06-27 15:28:54 +0000 |
commit | 006ad618b85040f6678307079e5d1439e9a012e6 (patch) | |
tree | c09ab114091eff888be170a92f5199f95ae151df /sys | |
parent | 54d6a350e0455180220e13ffc5cf9cda869630a0 (diff) | |
download | src-006ad618b85040f6678307079e5d1439e9a012e6.tar.gz src-006ad618b85040f6678307079e5d1439e9a012e6.zip |
Don't accept insane values for SO_(SND|RCV)BUF, and the low water marks.
Specifically, don't allow a value < 1 for any of them (it doesn't make
sense), and don't let the low water mark be greater than the corresponding
high water mark.
Pre-Approved by: wollman
Obtained from: NetBSD
Notes
Notes:
svn path=/head/; revision=26990
Diffstat (limited to 'sys')
-rw-r--r-- | sys/kern/uipc_socket.c | 31 |
1 files changed, 27 insertions, 4 deletions
diff --git a/sys/kern/uipc_socket.c b/sys/kern/uipc_socket.c index 095f764b0bb7..8c1319a74570 100644 --- a/sys/kern/uipc_socket.c +++ b/sys/kern/uipc_socket.c @@ -31,7 +31,7 @@ * SUCH DAMAGE. * * @(#)uipc_socket.c 8.3 (Berkeley) 4/15/94 - * $Id: uipc_socket.c,v 1.25 1997/03/23 03:36:31 bde Exp $ + * $Id: uipc_socket.c,v 1.26 1997/04/27 20:00:44 wollman Exp $ */ #include <sys/param.h> @@ -896,30 +896,53 @@ sosetopt(so, level, optname, m0, p) case SO_RCVBUF: case SO_SNDLOWAT: case SO_RCVLOWAT: + { + int optval; + if (m == NULL || m->m_len < sizeof (int)) { error = EINVAL; goto bad; } + + /* + * Values < 1 make no sense for any of these + * options, so disallow them. + */ + optval = *mtod(m, int *); + if (optval < 1) { + error = EINVAL; + goto bad; + } + switch (optname) { case SO_SNDBUF: case SO_RCVBUF: if (sbreserve(optname == SO_SNDBUF ? &so->so_snd : &so->so_rcv, - (u_long) *mtod(m, int *)) == 0) { + (u_long) optval) == 0) { error = ENOBUFS; goto bad; } break; + /* + * Make sure the low-water is never greater than + * the high-water. + */ case SO_SNDLOWAT: - so->so_snd.sb_lowat = *mtod(m, int *); + so->so_snd.sb_lowat = + (optval > so->so_snd.sb_hiwat) ? + so->so_snd.sb_hiwat : optval; break; case SO_RCVLOWAT: - so->so_rcv.sb_lowat = *mtod(m, int *); + so->so_rcv.sb_lowat = + (optval > so->so_rcv.sb_hiwat) ? + so->so_rcv.sb_hiwat : optval; break; } break; + } case SO_SNDTIMEO: case SO_RCVTIMEO: |