[net.bugs.4bsd] Unix Domain Datagram Bug.

steveh@hammer.UUCP (Stephen Hemminger) (11/21/84)

Description:
	If a two programs communicate via Unix domain datagrams, and the
	receiver can't keep up with the sender, then mbuf's are not
	freed which will eventually bring system to its knees.

Repeat-By:
	Make a program which sends datagrams to another program.
	Have receiver sleep between recvs.

Fix:
	Their is a misunderstanding in uipc_usrreq.c: 
	sbappendaddr() returns
		0 if an error (no space, no mbufs etc).
		1 data sent.
	The source mbuf chain is freed by sbappendaddr when it returns 1,
	BUT they are not freed if it returns 0!
	Change to uipc_usrreq.c fixes the problem.	

	Editted diffs of uipc_usrreq.c (line #'s are different from
	distribution sorry).

***************
*** 168,183
  				if (error)
  					break;
  			}
! 			/*
! 			 * Put data address and rights on receiver's queue.
! 			 * There's no record of source socket's
! 			 * name, so send null name for the moment.
! 			 * 
! 			 * If no space (returns 0), then m will be
! 			 * freed later.
! 			 */
! 			if (sbappendaddr(&so2->so_rcv, &sun_noname,
! 				m, rights) != 0) {
  				sbwakeup(&so2->so_rcv);
  				m = 0;
  			}

--- 164,176 -----
  				if (error)
  					break;
  			}
! 			if (sbspace(&so2->so_rcv) > 0) {
! 				/*
! 				 * There's no record of source socket's
! 				 * name, so send null name for the moment.
! 				 */
! 				(void) sbappendaddr(&so2->so_rcv,
! 				    &sun_noname, m, rights);
  				sbwakeup(&so2->so_rcv);
  				m = 0;
  			}