Skip to content

Commit

Permalink
[IPX]: Another nonlinear receive fix
Browse files Browse the repository at this point in the history
Need to check some more cases in IPX receive.  If the skb is purely
fragments, the IPX header needs to be extracted. The function
pskb_may_pull() may in theory invalidate all the pointers in the skb,
so references to ipx header must be refreshed.

Signed-off-by: Stephen Hemminger <shemminger@osdl.org>
Signed-off-by: David S. Miller <davem@davemloft.net>
  • Loading branch information
Stephen Hemminger authored and David S. Miller committed Aug 8, 2006
1 parent 70f8e78 commit 7b1ba8d
Showing 1 changed file with 5 additions and 2 deletions.
7 changes: 5 additions & 2 deletions net/ipx/af_ipx.c
Original file line number Diff line number Diff line change
Expand Up @@ -1642,14 +1642,17 @@ static int ipx_rcv(struct sk_buff *skb, struct net_device *dev, struct packet_ty
if ((skb = skb_share_check(skb, GFP_ATOMIC)) == NULL)
goto out;

ipx = ipx_hdr(skb);
ipx_pktsize = ntohs(ipx->ipx_pktsize);
if (!pskb_may_pull(skb, sizeof(struct ipxhdr)))
goto drop;

ipx_pktsize = ntohs(ipxhdr(skb)->ipx_pktsize);

/* Too small or invalid header? */
if (ipx_pktsize < sizeof(struct ipxhdr) ||
!pskb_may_pull(skb, ipx_pktsize))
goto drop;

ipx = ipx_hdr(skb);
if (ipx->ipx_checksum != IPX_NO_CHECKSUM &&
ipx->ipx_checksum != ipx_cksum(ipx, ipx_pktsize))
goto drop;
Expand Down

0 comments on commit 7b1ba8d

Please sign in to comment.