diff mbox

[rdma] infiniband: call ipv6 route lookup via the stub interface

Message ID 09d4a8a81a499ab61ed6883ae1aa17c5fa0a5b49.1493368728.git.pabeni@redhat.com (mailing list archive)
State Accepted
Headers show

Commit Message

Paolo Abeni April 28, 2017, 9:20 a.m. UTC
The infiniband address handle can be triggered to resolve an ipv6
address in response to MAD packets, regardless of the ipv6
module being disabled via the kernel command line argument.

That will cause a call into the ipv6 routing code, which is not
initialized, and a conseguent oops.

This commit addresses the above issue replacing the direct lookup
call with an indirect one via the ipv6 stub, which is properly
initialized according to the ipv6 status (e.g. if ipv6 is
disabled, the routing lookup fails gracefully)

Signed-off-by: Paolo Abeni <pabeni@redhat.com>
---
 drivers/infiniband/core/addr.c | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

Comments

Doug Ledford April 28, 2017, 4:56 p.m. UTC | #1
On Fri, 2017-04-28 at 11:20 +0200, Paolo Abeni wrote:
> The infiniband address handle can be triggered to resolve an ipv6
> address in response to MAD packets, regardless of the ipv6
> module being disabled via the kernel command line argument.
> 
> That will cause a call into the ipv6 routing code, which is not
> initialized, and a conseguent oops.
> 
> This commit addresses the above issue replacing the direct lookup
> call with an indirect one via the ipv6 stub, which is properly
> initialized according to the ipv6 status (e.g. if ipv6 is
> disabled, the routing lookup fails gracefully)
> 
> Signed-off-by: Paolo Abeni <pabeni@redhat.com>

Thanks Paolo, applied.  I also added a Cc: to stable for kernel 3.12+
since that's when the stub was added.
diff mbox

Patch

diff --git a/drivers/infiniband/core/addr.c b/drivers/infiniband/core/addr.c
index 0f58f46..8fd108d 100644
--- a/drivers/infiniband/core/addr.c
+++ b/drivers/infiniband/core/addr.c
@@ -444,8 +444,8 @@  static int addr6_resolve(struct sockaddr_in6 *src_in,
 	fl6.saddr = src_in->sin6_addr;
 	fl6.flowi6_oif = addr->bound_dev_if;
 
-	dst = ip6_route_output(addr->net, NULL, &fl6);
-	if ((ret = dst->error))
+	ret = ipv6_stub->ipv6_dst_lookup(addr->net, NULL, &dst, &fl6);
+	if (ret < 0)
 		goto put;
 
 	rt = (struct rt6_info *)dst;