Synopsis: NetBSD versions: 1.6.1, 1.6, 1.5.3, 1.5.2, 1.5.1, 1.5 Thanks to: Ignatios Souvatzis Reported in NetBSD Security Advisory: NetBSD-SA2003-010 Index: sys/netiso/clnp_er.c =================================================================== RCS file: /cvsroot/src/sys/netiso/clnp_er.c,v retrieving revision 1.12 retrieving revision 1.13 diff -c -p -r1.12 -r1.13 *** sys/netiso/clnp_er.c 2001/11/13 01:10:46 1.12 --- sys/netiso/clnp_er.c 2003/05/25 08:47:54 1.13 *************** clnp_emit_er(m, reason) *** 254,260 **** struct iso_addr src, dst, *our_addr; caddr_t hoff, hend; int total_len; /* total len of dg */ - struct mbuf *m0; /* contains er pdu hdr */ struct iso_ifaddr *ia = 0; #ifdef ARGO_DEBUG --- 254,259 ---- *************** clnp_emit_er(m, reason) *** 329,340 **** #endif /* allocate mbuf for er pdu header: punt on no space */ ! MGET(m0, M_DONTWAIT, MT_HEADER); ! if (m0 == 0) goto bad; ! m0->m_next = m; ! er = mtod(m0, struct clnp_fixed *); *er = er_template; /* setup src/dst on er pdu */ --- 328,344 ---- #endif /* allocate mbuf for er pdu header: punt on no space */ ! /* ! * fixed part, two addresses and their length bytes, and a ! * 4-byte option ! */ ! ! M_PREPEND(m, sizeof(struct clnp_fixed) + 4 + 1 + 1 + ! src.isoa_len + our_addr->isoa_len, M_DONTWAIT); ! if (m == 0) goto bad; ! er = mtod(m, struct clnp_fixed *); *er = er_template; /* setup src/dst on er pdu */ *************** clnp_emit_er(m, reason) *** 355,374 **** *hoff++ = 0; /* error localization = not specified */ /* set length */ ! er->cnf_hdr_len = m0->m_len = (u_char) (hoff - (caddr_t) er); ! total_len = m0->m_len + m->m_len; HTOC(er->cnf_seglen_msb, er->cnf_seglen_lsb, total_len); /* compute checksum (on header only) */ ! iso_gen_csum(m0, CLNP_CKSUM_OFF, (int) er->cnf_hdr_len); /* trim packet if too large for interface */ if (total_len > ifp->if_mtu) ! m_adj(m0, -(total_len - ifp->if_mtu)); /* send packet */ INCSTAT(cns_er_outhist[clnp_er_index(reason)]); ! (void) (*ifp->if_output) (ifp, m0, first_hop, route.ro_rt); goto done; bad: --- 359,378 ---- *hoff++ = 0; /* error localization = not specified */ /* set length */ ! er->cnf_hdr_len = (u_char) (hoff - (caddr_t) er); ! total_len = m->m_pkthdr.len; HTOC(er->cnf_seglen_msb, er->cnf_seglen_lsb, total_len); /* compute checksum (on header only) */ ! iso_gen_csum(m, CLNP_CKSUM_OFF, (int) er->cnf_hdr_len); /* trim packet if too large for interface */ if (total_len > ifp->if_mtu) ! m_adj(m, -(total_len - ifp->if_mtu)); /* send packet */ INCSTAT(cns_er_outhist[clnp_er_index(reason)]); ! (void) (*ifp->if_output) (ifp, m, first_hop, route.ro_rt); goto done; bad: