| From fba332b079029c2f4f7e84c1c1cd8e3867310c90 Mon Sep 17 00:00:00 2001 |
| From: Bart Van Assche <bart.vanassche@sandisk.com> |
| Date: Mon, 19 Dec 2016 18:00:05 +0100 |
| Subject: IB/cma: Fix a race condition in iboe_addr_get_sgid() |
| |
| From: Bart Van Assche <bart.vanassche@sandisk.com> |
| |
| commit fba332b079029c2f4f7e84c1c1cd8e3867310c90 upstream. |
| |
| Code that dereferences the struct net_device ip_ptr member must be |
| protected with an in_dev_get() / in_dev_put() pair. Hence insert |
| calls to these functions. |
| |
| Fixes: commit 7b85627b9f02 ("IB/cma: IBoE (RoCE) IP-based GID addressing") |
| Signed-off-by: Bart Van Assche <bart.vanassche@sandisk.com> |
| Reviewed-by: Moni Shoua <monis@mellanox.com> |
| Cc: Or Gerlitz <ogerlitz@mellanox.com> |
| Cc: Roland Dreier <roland@purestorage.com> |
| Signed-off-by: Doug Ledford <dledford@redhat.com> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| |
| --- |
| include/rdma/ib_addr.h | 6 ++++-- |
| 1 file changed, 4 insertions(+), 2 deletions(-) |
| |
| --- a/include/rdma/ib_addr.h |
| +++ b/include/rdma/ib_addr.h |
| @@ -205,10 +205,12 @@ static inline void iboe_addr_get_sgid(st |
| |
| dev = dev_get_by_index(&init_net, dev_addr->bound_dev_if); |
| if (dev) { |
| - ip4 = (struct in_device *)dev->ip_ptr; |
| - if (ip4 && ip4->ifa_list && ip4->ifa_list->ifa_address) |
| + ip4 = in_dev_get(dev); |
| + if (ip4 && ip4->ifa_list && ip4->ifa_list->ifa_address) { |
| ipv6_addr_set_v4mapped(ip4->ifa_list->ifa_address, |
| (struct in6_addr *)gid); |
| + in_dev_put(ip4); |
| + } |
| dev_put(dev); |
| } |
| } |