Module Name:    src
Committed By:   kefren
Date:           Fri Jul  2 07:02:00 UTC 2010

Modified Files:
        src/sys/netinet: ip_icmp.c

Log Message:
manually adjust m_data and m_len so it can later be prepended with a
struct ip in case that a cluster is used. icmp len panic is not valid for
cluster case.

Fixes PR/43548


To generate a diff of this commit:
cvs rdiff -u -r1.123 -r1.124 src/sys/netinet/ip_icmp.c

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/sys/netinet/ip_icmp.c
diff -u src/sys/netinet/ip_icmp.c:1.123 src/sys/netinet/ip_icmp.c:1.124
--- src/sys/netinet/ip_icmp.c:1.123	Sat Jun 26 14:24:29 2010
+++ src/sys/netinet/ip_icmp.c	Fri Jul  2 07:02:00 2010
@@ -1,4 +1,4 @@
-/*	$NetBSD: ip_icmp.c,v 1.123 2010/06/26 14:24:29 kefren Exp $	*/
+/*	$NetBSD: ip_icmp.c,v 1.124 2010/07/02 07:02:00 kefren Exp $	*/
 
 /*
  * Copyright (C) 1995, 1996, 1997, and 1998 WIDE Project.
@@ -94,7 +94,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: ip_icmp.c,v 1.123 2010/06/26 14:24:29 kefren Exp $");
+__KERNEL_RCSID(0, "$NetBSD: ip_icmp.c,v 1.124 2010/07/02 07:02:00 kefren Exp $");
 
 #include "opt_ipsec.h"
 
@@ -309,6 +309,10 @@
 	m->m_len = icmplen + ICMP_MINLEN;
 	if ((m->m_flags & M_EXT) == 0)
 		MH_ALIGN(m, m->m_len);
+	else {
+		m->m_data += sizeof(struct ip);
+		m->m_len -= sizeof(struct ip);
+	}
 	icp = mtod(m, struct icmp *);
 	if ((u_int)type > ICMP_MAXTYPE)
 		panic("icmp_error");
@@ -337,7 +341,8 @@
 	 * Now, copy old ip header (without options)
 	 * in front of icmp message.
 	 */
-	if (m->m_data - sizeof(struct ip) < m->m_pktdat)
+	if ((m->m_flags & M_EXT) == 0 &&
+	    m->m_data - sizeof(struct ip) < m->m_pktdat)
 		panic("icmp len");
 	m->m_data -= sizeof(struct ip);
 	m->m_len += sizeof(struct ip);

Reply via email to