Source-Changes-HG archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

[src/trunk]: src/sys/netinet manually adjust m_data and m_len so it can later...



details:   https://anonhg.NetBSD.org/src/rev/eec120a5aa7d
branches:  trunk
changeset: 755996:eec120a5aa7d
user:      kefren <kefren%NetBSD.org@localhost>
date:      Fri Jul 02 07:02:00 2010 +0000

description:
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

diffstat:

 sys/netinet/ip_icmp.c |  11 ++++++++---
 1 files changed, 8 insertions(+), 3 deletions(-)

diffs (39 lines):

diff -r bcbb9c2c4fe3 -r eec120a5aa7d sys/netinet/ip_icmp.c
--- a/sys/netinet/ip_icmp.c     Fri Jul 02 05:18:38 2010 +0000
+++ b/sys/netinet/ip_icmp.c     Fri Jul 02 07:02:00 2010 +0000
@@ -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);



Home | Main Index | Thread Index | Old Index