Skip site navigation (1)Skip section navigation (2)
Date:      Fri, 12 Sep 1997 01:12:12 +0200
From:      sthaug@nethelp.no
To:        fenner@FreeBSD.ORG
Cc:        freebsd-bugs@hub.freebsd.org
Subject:   Re: kern/3925
Message-ID:  <402.874019532@verdi.nethelp.no>
In-Reply-To: Your message of "Sat, 5 Jul 1997 11:55:59 -0700 (PDT)"
References:  <199707051855.LAA16321@hub.freebsd.org>

next in thread | previous in thread | raw e-mail | index | archive | help
> Synopsis: SO_SNDLOWAT of 0 causes kernel to use 99% of CPU time on TCP send
> 
> State-Changed-From-To: open-feedback
> State-Changed-By: fenner
> State-Changed-When: Sat Jul 5 11:55:17 PDT 1997
> State-Changed-Why: 
> Could you verify that rev 1.27 of kern/uipc_socket.c fixes this problem?

Hi, sorry this took so long - I'm afraid your message arrived during
vacation time here, and got lost in my mailbox.

Anyway, I have tested the patch, and it looks good. My problem has been
resolved, and the test program now gets EINVAL as it should.

Please note that I haven't been able to test 1.27 directly. What I did was:

- Grab uipc_socket.c 1.30 from FreeBSD-current at ftp.cdrom.com.
- Locate the changes related to kern/3925.
- Backport these changes to my current system (2.2-970801-RELENG, with
uipc_socket.c 1.20.2.1).
- And test the new kernel based on these changes.

Below is a context diff against uipc_socket.c 1.20.2.1 - this could
probably go into the RELENG_2_2 branch.

Steinar Haug, Nethelp consulting, sthaug@nethelp.no
----------------------------------------------------------------------
*** uipc_socket.c.orig	Tue Dec  3 11:48:58 1996
--- uipc_socket.c	Fri Sep 12 00:31:57 1997
***************
*** 893,922 ****
  		case SO_RCVBUF:
  		case SO_SNDLOWAT:
  		case SO_RCVLOWAT:
  			if (m == NULL || m->m_len < sizeof (int)) {
  				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) {
  					error = ENOBUFS;
  					goto bad;
  				}
  				break;
  
  			case SO_SNDLOWAT:
! 				so->so_snd.sb_lowat = *mtod(m, int *);
  				break;
  			case SO_RCVLOWAT:
! 				so->so_rcv.sb_lowat = *mtod(m, int *);
  				break;
  			}
  			break;
  
  		case SO_SNDTIMEO:
  		case SO_RCVTIMEO:
--- 893,945 ----
  		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) 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 =
! 				    (optval > so->so_snd.sb_hiwat) ?
! 				    so->so_snd.sb_hiwat : optval;
  				break;
  			case SO_RCVLOWAT:
! 				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:



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?402.874019532>