>Number: 153841 >Category: kern >Synopsis: page fault in icmp6_error2() called from nd6_llinfo_timer() >Confidential: no >Severity: critical >Priority: high >Responsible: freebsd-bugs >State: open >Quarter: >Keywords: >Date-Required: >Class: sw-bug >Submitter-Id: current-users >Arrival-Date: Mon Jan 10 12:50:07 UTC 2011 >Closed-Date: >Last-Modified: >Originator: Petr Lampa >Release: 8.2-PRERELEASE >Organization: BUT brno >Environment: FreeBSD xxx 8.2-PRERELEASE FreeBSD 8.2-PRERELEASE #16: Tue Nov 30 12:44:18 CET 2010 r...@xxxx:/usr/src/sys/i386/compile/GUTA i386
>Description: page fault Stopped at icmp6_error2+0xc3: movl 0x1dc(%eax),%eax where: Tracing pid 11 tid 1000006 td 0xc851e000 icmp6_error2(cad86800,1,3,0,c86d4c00,...) at icmp6_error2+0xc3 nd6_llinfo_timer(cc7da400,c851e000,c838bc40,c851e870,c851e000,...) at timer+0x126 softclock(c07bd760,c851e000,0,109,3b7b822b,...) at softclock_0x22a icmp6_error2+0xa3: jmp icmp6_error2+0x136 icmp6_error2+0xa8: cmpl $0x27,0xc(%ebx) icmp6_error2+0xac: jnbe icmp6_error2+0xe0 icmp6_error2+0xae: addl $0x1,ip6stat+0x8 icmp6_error2+0xb5: adcl $0,ip6stat+0xc icmp6_error2+0xbc: movl 0x18(%ebx),%eax icmp6_error2+0xbf: testl %eax,%eax icmp6_error2+0xc1: jz icmp6_error2+0xd3 icmp6_error2+0xc3: movl 0x1dc(%eax),%eax icmp6_error2+0xc9: movl 0(%eax),%eax icmp6_error2+0xcb: addl $0x1,0x30(%eax) icmp6_error2+0xcf: adcl $0,0x34(%eax) icmp6_error2+0xd3: movl %ebx,0(%esp) icmp6_error2+0xd6: call m_freem icmp6_error2+0xdb: jmp icmp6_error2+0x136 icmp6_error2+0xdd: leal 0(%esi),%esi icmp6_error2+0xe0: movl 0x8(%ebx),%esi icmp6_error2+0xe3: movl $0,0x8(%esp) icmp6_error2+0xeb: movl %edi,0x4(%esp) icmp6_error2+0xef: leal 0x8(%esi),%eax icmp6_error2+0xf2: movl ieax,0(%esp) icmp6_error2+0xf5: call in6_setscope icmp6_error2+0xfa: testl %eax,%eax icmp6_error2+0xfc: jnz icmp6_error2+0x136 (sorry, if there is some garbage here, this is a result of ocr) So, the location of page fault corresponds to the last branch of IP6_EXTHDR_CHECK() macro expanded in icmp6_error2: if ((m)->m_len < (off) + (hlen)) { \ V_ip6stat.ip6s_tooshort++; \ in6_ifstat_inc(m->m_pkthdr.rcvif, ifs6_in_truncated); \ The content of mbuf (m) is: 0xcad86800: 0 0 cad86896 1e 0xcad86810: 0 1 0 0 0xcad86820: 5a 0 4 6 0xcad86830: 0 0 5e0000 30000 It seems, that pkthdr is not there and so m->m_pkthdr.rcvif is 0 and it's dereferenced without a check. >How-To-Repeat: It happened after ping6/traceroute6 (not sure) to unresponding IPv6 address, which after time started responding (probably, I'm not really sure). >Fix: check flags for M_PKTHDR in IP6_EXTHDR_CHECK() >Release-Note: >Audit-Trail: >Unformatted: _______________________________________________ freebsd-bugs@freebsd.org mailing list http://lists.freebsd.org/mailman/listinfo/freebsd-bugs To unsubscribe, send any mail to "freebsd-bugs-unsubscr...@freebsd.org"