From: Jarno Rajahalme Date: Tue, 11 Feb 2014 23:34:39 +0000 (-0800) Subject: datapath: Fix race. X-Git-Tag: v2.1.0~19 X-Git-Url: http://git.cascardo.eti.br/?p=cascardo%2Fovs.git;a=commitdiff_plain;h=b05dd42a168e0e028748f8de7d4a63b761b2d687 datapath: Fix race. ovs_vport_cmd_dump() did rcu_read_lock() only after getting the datapath, which could have been deleted in between. Resolved by taking rcu_read_lock() before the get_dp() call. Signed-off-by: Jarno Rajahalme --- diff --git a/datapath/datapath.c b/datapath/datapath.c index 5f1b34cbf..f496509ec 100644 --- a/datapath/datapath.c +++ b/datapath/datapath.c @@ -1764,11 +1764,12 @@ static int ovs_vport_cmd_dump(struct sk_buff *skb, struct netlink_callback *cb) int bucket = cb->args[0], skip = cb->args[1]; int i, j = 0; + rcu_read_lock(); dp = get_dp(sock_net(skb->sk), ovs_header->dp_ifindex); - if (!dp) + if (!dp) { + rcu_read_unlock(); return -ENODEV; - - rcu_read_lock(); + } for (i = bucket; i < DP_VPORT_HASH_BUCKETS; i++) { struct vport *vport;