On Thu, 2012-10-04 at 20:05 -0700, ramesh.naga...@gmail.com wrote:
> From: Ramesh Nagappa <ramesh.naga...@ericsson.com>
> 
> The retry loop in neigh_resolve_output() and neigh_connected_output()
> call dev_hard_header() with out reseting the skb to network_header.
> This causes the retry to fail with skb_under_panic. The fix is to
> reset the network_header within the retry loop.
> 
> Signed-off-by: Ramesh Nagappa <ramesh.naga...@ericsson.com>
> Reviewed-by: Shawn Lu <shawn...@ericsson.com>
> Reviewed-by: Robert Coulson <robert.coul...@ericsson.com>
> Reviewed-by: Billie Alsup <billie.al...@ericsson.com>
> ---
>  net/core/neighbour.c | 4 ++--
>  1 file changed, 2 insertions(+), 2 deletions(-)
> 
> diff --git a/net/core/neighbour.c b/net/core/neighbour.c
> index 117afaf..f50c542 100644
> --- a/net/core/neighbour.c
> +++ b/net/core/neighbour.c
> @@ -1313,6 +1313,7 @@ int neigh_resolve_output(struct neighbour *neigh, 
> struct sk_buff *skb)
>  
>               do {
>                       seq = read_seqbegin(&neigh->ha_lock);
> +                     __skb_pull(skb, skb_network_offset(skb));

This __skb_pull() could be done before the read_seqbegin() to keep the
protected section short.

>                       err = dev_hard_header(skb, dev, ntohs(skb->protocol),
>                                             neigh->ha, NULL, skb->len);
>               } while (read_seqretry(&neigh->ha_lock, seq));
> @@ -1342,10 +1343,9 @@ int neigh_connected_output(struct neighbour *neigh, 
> struct sk_buff *skb)
>       unsigned int seq;
>       int err;
>  
> -     __skb_pull(skb, skb_network_offset(skb));
> -
>       do {
>               seq = read_seqbegin(&neigh->ha_lock);
> +             __skb_pull(skb, skb_network_offset(skb));

This __skb_pull() could be done before the read_seqbegin() to keep the
protected section short.

>               err = dev_hard_header(skb, dev, ntohs(skb->protocol),
>                                     neigh->ha, NULL, skb->len);
>       } while (read_seqretry(&neigh->ha_lock, seq));

Thanks


--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

Reply via email to