Thread (8 messages) 8 messages, 3 authors, 2011-09-13

Re: [PATCH] ixgbe: drop zero length frame segments during a packet split rx

flat view

From: Neil Horman <nhorman@tuxdriver.com>
Date: 2011-09-02 16:55:31

On Fri, Sep 02, 2011 at 09:17:40AM -0700, Alexander Duyck wrote:
This kind of fix just opens up a whole can of security related
worms.  If you are going to discard a packet you should do it after
we have reached the EOP in the series.  My advice would be to
determine what traits identify this packet and add those to the
check for the IXGBE_RXDADV_ERR_FRAME_ERR_MASK check further down in
the code.  Likely what you are seeing is skb_headlen(skb) will be
equal to 0.
Well, the traits of the bogus descriptor are almost exactly as you describe
them, i.e. rx_buffer_info->dma is zero, which the driver takes to mean packet
split is enabled, and this is a buffer in the middle of that operation
(according to the comments in ixgbe_clean_rx_irq), and the upper_len value we
read from the rx_descriptior rx_dex->wb.upper.length is zero.  This implies we
have a frame which is in the middle of a packet split receive, and one of the
page long buffers has a length value of zero, which is non-sensical.  I suppose
we could wait until the next frame with EOP set to discard the whole thing, but
I'm not sure how that amounts to anything different than just skipping to the
next descriptor.
I'm suspecting this is some sort of read corruption.  It looks like
in order to trigger it you have to either be reading
rx_buffer_info->dma as 0, or the header length is being read as 0.
Correct, which drops us into the else clause of the if(rx_buffer_info->dma)
conditional in ixgbe_clean_rx_irq.
Do you know if you actually have header split enabled when this is
occuring?  Are you running with jumbo frames enabled to see the
Yes, packet split is enabled. and no, Jumbo frames are not in use.
issue?  If not then packet split wouldn't be enabled.

Is this occurring on net-next or on an older kernel?  I just want to
be sure since we added a read memory barrier in 2.6.34 to address
the fact that the length and descriptor DD bits were being read in
the wrong order resulting in the length being corrupted on PowerPC
systems.  The fact that we are now seeing another length error on
PowerPC seems very odd.
According to the bz:
https://bugzilla.redhat.com/show_bug.cgi?id=683611
This appears to be happening on RHEL, and on upstream kernels, as well as the
sourceforge driver.  Don't quote me on the SF driver though, because I never got
a clear answer on that.  Although, fwiw, the RHEL version of the driver in which
we were definately seeing this problem has a read memory barrrier at the top of
the loop in ixgbe_clean_rx_irq, pulled in from commit
3c945e5b3719bcc18c6ddd31bbcae8ef94f3d19a, so I think thats handled.


Regards
Neil
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help