From 6b02c20141e318bf95ecbd384c73bdf7f74920d3 Mon Sep 17 00:00:00 2001 From: Jesse Gross Date: Thu, 23 Dec 2010 16:47:45 -0800 Subject: [PATCH] datapath: Use RCU dereference in vport_get_ifindex(). If we don't have an ifindex for a device (because it is a virtual port), we fall back to using the ifindex of the local port. However, we weren't properly dereferencing the vport from the ports array, so this adds that. This isn't a real problem though, because the local port always exists and never changes as long as the datapath exists. Found with sparse. Signed-off-by: Jesse Gross Acked-by: Ben Pfaff --- datapath/vport.c | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/datapath/vport.c b/datapath/vport.c index 9e847e5a..6c053ac2 100644 --- a/datapath/vport.c +++ b/datapath/vport.c @@ -928,10 +928,10 @@ unsigned char vport_get_operstate(const struct vport *vport) * * @vport: vport from which to retrieve index * - * Retrieves the system interface index of the given device. Not all devices - * will have system indexes, in which case the index of the datapath local - * port is returned. Returns a negative index on error. Either RTNL lock or - * rcu_read_lock must be held. + * Retrieves the system interface index of the given device. Not all + * devices will have system indexes, in which case the index of the + * datapath local port is returned. Returns a negative index on error. + * Either RTNL lock or rcu_read_lock must be held. */ int vport_get_ifindex(const struct vport *vport) { @@ -940,7 +940,8 @@ int vport_get_ifindex(const struct vport *vport) /* If we don't actually have an ifindex, use the local port's. * Userspace doesn't check it anyways. */ - return vport_get_ifindex(vport->dp->ports[ODPP_LOCAL]); + return vport_get_ifindex(rcu_dereference_rtnl(vport->dp-> + ports[ODPP_LOCAL])); } /** -- 2.30.2