From: Jesse Gross Date: Fri, 10 Dec 2010 00:40:15 +0000 (-0800) Subject: datpath: Fix memory leak when a loop is detected. X-Git-Tag: v1.1.0~653 X-Git-Url: http://git.onelab.eu/?a=commitdiff_plain;h=f267de8ae6af2509128d28e1cd0dd21aee7c9734;p=sliver-openvswitch.git datpath: Fix memory leak when a loop is detected. If we detect a packet that is looping we kill the flow but then don't do anything with the packet that caused the problem in the first place, so this frees the packet. This isn't a very serious leak because we try to shut off the flow that lead to the loop as early as possible. Once this happens, packets will no longer hit the loop detector and will be freed just as any other packet that should be dropped. It also fixes an issue where the offset to the stats counter is uninitialized after a loop is detected. Signed-off-by: Jesse Gross Acked-by: Ben Pfaff --- diff --git a/datapath/datapath.c b/datapath/datapath.c index cc7672058..634ac1b65 100644 --- a/datapath/datapath.c +++ b/datapath/datapath.c @@ -501,6 +501,7 @@ void dp_process_received_packet(struct vport *p, struct sk_buff *skb) OVS_CB(skb)->flow = flow_cast(flow_node); } + stats_counter_off = offsetof(struct dp_stats_percpu, n_hit); flow_used(OVS_CB(skb)->flow, skb); acts = rcu_dereference(OVS_CB(skb)->flow->sf_acts); @@ -511,13 +512,13 @@ void dp_process_received_packet(struct vport *p, struct sk_buff *skb) loop->looping = true; if (unlikely(loop->looping)) { loop_suppress(dp, acts); + kfree_skb(skb); goto out_loop; } /* Execute actions. */ execute_actions(dp, skb, &OVS_CB(skb)->flow->key, acts->actions, acts->actions_len); - stats_counter_off = offsetof(struct dp_stats_percpu, n_hit); /* Check whether sub-actions looped too much. */ if (unlikely(loop->looping))