On Mon, Aug 25, 2014 at 3:24 PM, Andy Zhou <az...@nicira.com> wrote: > If recirc action is the last action of a action list, the SKB triggers > the recirc will be freed twice. This patch fixes this bug. > > Reported-by: Justin Pettit <jpet...@nicira.com> > Signed-off-by: Andy Zhou <az...@nicira.com> > --- > datapath/actions.c | 6 ++++++ > 1 file changed, 6 insertions(+) > > diff --git a/datapath/actions.c b/datapath/actions.c > index d70348e..2bfc527 100644 > --- a/datapath/actions.c > +++ b/datapath/actions.c > @@ -897,6 +897,12 @@ static int do_execute_actions(struct datapath *dp, > struct sk_buff *skb, > > case OVS_ACTION_ATTR_RECIRC: > err = execute_recirc(dp, skb, a, rem); > + if (last_action(a, rem)) { > + /* If this is the last action, the skb has > + * been consumed or freed. > + * Return immediately. */ > + return err; > + }
I think better way is not return error from execute_recirc() action. Currently execute_recirc() has odd behavior, it return 0 if skb_clone fails, but return error if ovs_flow_key_update() fails. by not returning error from execute_recirc(), action execute can return on just last action. > break; > > case OVS_ACTION_ATTR_SET: > -- > 1.9.1 > > _______________________________________________ > dev mailing list > dev@openvswitch.org > http://openvswitch.org/mailman/listinfo/dev _______________________________________________ dev mailing list dev@openvswitch.org http://openvswitch.org/mailman/listinfo/dev