[comp.bugs.4bsd.ucb-fixes] ARTICLE #7

bostic@OKEEFFE.BERKELEY.EDU (Keith Bostic) (03/23/87)

4.3BSD network bug (#3, MCLGET/mbuf.h)
Index:	sys/h/mbuf.h 4.3BSD FIX

Description:
The macros for addition of page clusters to mbufs were revised in 4.3BSD.
A new macro, MCLGET, is called to add a single page cluster to an mbuf.
If there are no free clusters, the macro calls m_clalloc to attempt
to create a new cluster.  Unfortunately, the MCLGET macro does not run
at high priority, but m_clalloc may only be called from splimp to block
reentrance of the memory allocation routines.  The call to m_clalloc
should be made from MCLALLOC, which does run at high priority. Although
rare, the bug described in this report may cause unexplained crashes or
random failures.

Fix:
In the file /sys/h/mbuf.h, move the test of mclfree and call to m_clalloc
from the MCLGET macro to the MCLALLOC macro, as shown by the following diffs:

*** mbuf.h.old	Thu Sep 11 06:07:29 1986
--- mbuf.h	Thu Sep 11 06:20:07 1986
***************
*** 5,7 ****
   *
!  *	@(#)mbuf.h	7.1 (Berkeley) 6/4/86
   */
--- 5,7 ----
   *
!  *	@(#)mbuf.h	7.3 (Berkeley) 9/11/86
   */
***************
*** 97,98 ****
--- 97,100 ----
  	{ int ms = splimp(); \
+ 	  if (mclfree == 0) \
+ 		(void)m_clalloc((i), MPG_CLUSTERS, M_DONTWAIT); \
  	  if ((m)=mclfree) \
***************
*** 105,108 ****
  	{ struct mbuf *p; \
- 	  if (mclfree == 0) \
- 		(void)m_clalloc(1, MPG_CLUSTERS, M_DONTWAIT); \
  	  MCLALLOC(p, 1); \
--- 107,108 ----