Apply by doing: cd /usr/src/sys patch -p0 < 003_espdata.patch And then rebuild your kernel. --- netinet/ip_esp_new.c:1.40 Sun May 9 18:06:31 1999 +++ netinet/ip_esp_new.c Wed May 12 23:11:42 1999 @@ -781,7 +781,7 @@ struct ip *ip, ipo; int i, ilen, ohlen, nh, rlen, plen, padding, rest; struct esp_new espo; - struct mbuf *mi, *mo; + struct mbuf *mi, *mo = (struct mbuf *) NULL; u_char *pad, *idat, *odat, *ivp; u_char iv[ESP_MAX_IVS], blk[ESP_MAX_BLKS], auth[AH_ALEN_MAX], opts[40]; union { @@ -799,6 +799,39 @@ alen = 0; espstat.esps_output++; + + /* + * Loop through mbuf chain; if we find an M_EXT mbuf with + * more than one reference, replace the rest of the chain. + */ + mi = m; + while (mi != NULL && + (!(mi->m_flags & M_EXT) || + mclrefcnt[mtocl(mi->m_ext.ext_buf)] <= 1)) + { + mo = mi; + mi = mi->m_next; + } + + if (mi != NULL) + { + /* Replace the rest of the mbuf chain. */ + struct mbuf *n = m_copym2(mi, 0, M_COPYALL, M_DONTWAIT); + + if (n == NULL) + { + espstat.esps_hdrops++; + m_freem(m); + return ENOBUFS; + } + + if (mo != NULL) + mo->m_next = n; + else + m = n; + + m_freem(mi); + } m = m_pullup(m, sizeof (struct ip)); /* Get IP header in one mbuf */ if (m == NULL) --- netinet/ip_esp_old.c:1.31 Sun May 9 20:14:50 1999 +++ netinet/ip_esp_old.c Wed May 12 23:11:42 1999 @@ -505,7 +505,7 @@ struct ip *ip, ipo; int i, ilen, ohlen, nh, rlen, plen, padding, rest; u_int32_t spi; - struct mbuf *mi, *mo; + struct mbuf *mi, *mo = (struct mbuf *) NULL; u_char *pad, *idat, *odat, *ivp; u_char iv[ESP_3DES_IVS], blk[ESP_3DES_IVS], opts[40]; int iphlen, blks; @@ -513,6 +513,39 @@ blks = espx->blocksize; espstat.esps_output++; + + /* + * Loop through mbuf chain; if we find an M_EXT mbuf with + * more than one reference, replace the rest of the chain. + */ + mi = m; + while (mi != NULL && + (!(mi->m_flags & M_EXT) || + mclrefcnt[mtocl(mi->m_ext.ext_buf)] <= 1)) + { + mo = mi; + mi = mi->m_next; + } + + if (mi != NULL) + { + /* Replace the rest of the mbuf chain. */ + struct mbuf *n = m_copym2(mi, 0, M_COPYALL, M_DONTWAIT); + + if (n == NULL) + { + espstat.esps_hdrops++; + m_freem(m); + return ENOBUFS; + } + + if (mo != NULL) + mo->m_next = n; + else + m = n; + + m_freem(mi); + } m = m_pullup(m, sizeof(struct ip)); if (m == NULL)