From: Andy Zhou Date: Thu, 10 Jul 2014 07:30:27 +0000 (-0700) Subject: datapath: add skb_clone NULL check in the recirc action. X-Git-Tag: v2.3~29 X-Git-Url: http://git.cascardo.eti.br/?p=cascardo%2Fovs.git;a=commitdiff_plain;h=04fa7d0df76704cc92288c7407d1750fbe94bad6 datapath: add skb_clone NULL check in the recirc action. Refactoring recirc action implementation. The main change is to fix a bug where the NULL check after skb clone() call is missing. The fix is to return -ENOMEM whenever skb_clone() failed to create a clone. Also rearranged adjacent code to improve readability. Reported-by: Pravin B Shelar Signed-off-by: Andy Zhou Acked-by: Pravin B Shelar --- diff --git a/datapath/actions.c b/datapath/actions.c index 603c7cb5f..1583a9503 100644 --- a/datapath/actions.c +++ b/datapath/actions.c @@ -619,15 +619,17 @@ static int do_execute_actions(struct datapath *dp, struct sk_buff *skb, case OVS_ACTION_ATTR_RECIRC: { struct sk_buff *recirc_skb; - if (!last_action(a, rem)) - recirc_skb = skb_clone(skb, GFP_ATOMIC); - else - recirc_skb = skb; + if (last_action(a, rem)) + return execute_recirc(dp, skb, a); - err = execute_recirc(dp, recirc_skb, a); + /* Recirc action is the not the last action + * of the action list. */ + recirc_skb = skb_clone(skb, GFP_ATOMIC); - if (recirc_skb == skb) - return err; + /* Skip the recirc action when out of memory, but + * continue on with the rest of the action list. */ + if (recirc_skb) + err = execute_recirc(dp, recirc_skb, a); break; }