From: Ian McDonald <[EMAIL PROTECTED]>
Date: Thu, 13 Oct 2005 16:21:27 +1300
> EIP is at ip_queue_xmit+0x14/0x4c0
...
> Code: 44 24 04 e8 6f 05 00 00 e9 e8 fe ff ff 8d 76 00 8d bc 27 00 00
> 00 00 55 57 56 53 81 ec bc 00 00 00 8b ac 24 d0 00 00 00 8b 5d 08
> <8b> 83 3c 01 00 00 89 44 24 14 8b 45 28 85 c0 89 44 24 18 0f 85
This corresponds to the beginning of ip_queue_xmit which, from Code:,
disassembles like this (with C code guesses using my novice
understanding of the x86 :-):
ip_queue_xmit:
push %ebp
push %edi
push %esi
push %ebx
sub $0xbc, %esp
mov 0xd0(%esp), %ebp ! %ebp = arg0 (skb)
mov 0x8(%ebp), %ebx ! %ebx = skb->sk
mov 0x13c(%ebx), %eax ! %eax = inet_sk(sk)->opt
We crash on that last instruction because %ebx is zero during the
load, so the problem appears to be that skb->sk is NULL.
So find out what path in the DCCP stack allows an output packet
SKB to not have skb->sk initialized. :-)
This funny buisness with only doing a skb_set_owner_w(skb, sk)
in dccp_transmit_skb() if the SKB is cloned is probably part
of the problem.
For example, the first OOPS goes back into dccp_retransmit_skb(). If
the skb is already cloned, it makes a copy using pskb_copy() and
passes that to dccp_transmit_skb(). That won't pass the
"skb_cloned()" test, and will likely leave us with a NULL skb->sk.
There needs to therefore be a better way to test "not DATA packet" in
dccp_transmit_skb(), because "skb_cloned()" obviously does not always
indicate that.
So there's your bug :-)
-
To unsubscribe from this list: send the line "unsubscribe dccp" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at http://vger.kernel.org/majordomo-info.html