summaryrefslogtreecommitdiffstats
path: root/sys/kern/uipc_socket.c
diff options
context:
space:
mode:
authorpeter <peter@FreeBSD.org>1997-06-27 15:28:54 +0000
committerpeter <peter@FreeBSD.org>1997-06-27 15:28:54 +0000
commit4e31107244c91966217018a9a8c5a85fddbdd0bf (patch)
tree8815fc26f5f431d1741861de59033898f6a14860 /sys/kern/uipc_socket.c
parentffc2d3d70315c587069f7268c77ccacce772a7e4 (diff)
downloadFreeBSD-src-4e31107244c91966217018a9a8c5a85fddbdd0bf.zip
FreeBSD-src-4e31107244c91966217018a9a8c5a85fddbdd0bf.tar.gz
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
Diffstat (limited to 'sys/kern/uipc_socket.c')
-rw-r--r--sys/kern/uipc_socket.c31
1 files changed, 27 insertions, 4 deletions
diff --git a/sys/kern/uipc_socket.c b/sys/kern/uipc_socket.c
index 095f764..8c1319a 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:
OpenPOWER on IntegriCloud