From f267de8ae6af2509128d28e1cd0dd21aee7c9734 Mon Sep 17 00:00:00 2001 From: Jesse Gross Date: Thu, 9 Dec 2010 16:40:15 -0800 Subject: [PATCH] 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 --- datapath/datapath.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) 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)) -- 2.43.0