aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/infiniband
diff options
context:
space:
mode:
authorshefty <sean.hefty@intel.com>2012-11-28 15:39:52 -0500
committerRoland Dreier <roland@purestorage.com>2012-11-29 15:16:29 -0500
commit63f05be2c075022d1b3227037f82ad75c4d5ab1d (patch)
tree7c51a7f55a4cf0e121ce1a8f5ba6c9fe075b7686 /drivers/infiniband
parentf4a75d2eb7b1e2206094b901be09adb31ba63681 (diff)
RDMA/cm: Change return value from find_gid_port()
Problem reported by Dan Carpenter <dan.carpenter@oracle.com>: The patch 3c86aa70bf67: "RDMA/cm: Add RDMA CM support for IBoE devices" from Oct 13, 2010, leads to the following warning: net/sunrpc/xprtrdma/svc_rdma_transport.c:722 svc_rdma_create() error: passing non neg 1 to ERR_PTR This bug would result in a NULL dereference. svc_rdma_create() is supposed to return ERR_PTRs or valid pointers, but instead it returns ERR_PTRs, valid pointers and 1. The call tree is: svc_rdma_create() => rdma_bind_addr() => cma_acquire_dev() => find_gid_port() rdma_bind_addr() should return a valid errno. Fix this by having find_gid_port() also return a valid errno. If we can't find the specified GID on a given port, return -EADDRNOTAVAIL, rather than -EAGAIN, to better indicate the error. We also drop using the special return value of '1' and instead pass through the error returned by the underlying verbs call. On such errors, rather than aborting the search, we simply continue to check the next device/port. Signed-off-by: Sean Hefty <sean.hefty@intel.com> Signed-off-by: Roland Dreier <roland@purestorage.com>
Diffstat (limited to 'drivers/infiniband')
-rw-r--r--drivers/infiniband/core/cma.c9
1 files changed, 4 insertions, 5 deletions
diff --git a/drivers/infiniband/core/cma.c b/drivers/infiniband/core/cma.c
index a7568c34a1aa..d789eea32168 100644
--- a/drivers/infiniband/core/cma.c
+++ b/drivers/infiniband/core/cma.c
@@ -345,17 +345,17 @@ static int find_gid_port(struct ib_device *device, union ib_gid *gid, u8 port_nu
345 345
346 err = ib_query_port(device, port_num, &props); 346 err = ib_query_port(device, port_num, &props);
347 if (err) 347 if (err)
348 return 1; 348 return err;
349 349
350 for (i = 0; i < props.gid_tbl_len; ++i) { 350 for (i = 0; i < props.gid_tbl_len; ++i) {
351 err = ib_query_gid(device, port_num, i, &tmp); 351 err = ib_query_gid(device, port_num, i, &tmp);
352 if (err) 352 if (err)
353 return 1; 353 return err;
354 if (!memcmp(&tmp, gid, sizeof tmp)) 354 if (!memcmp(&tmp, gid, sizeof tmp))
355 return 0; 355 return 0;
356 } 356 }
357 357
358 return -EAGAIN; 358 return -EADDRNOTAVAIL;
359} 359}
360 360
361static int cma_acquire_dev(struct rdma_id_private *id_priv) 361static int cma_acquire_dev(struct rdma_id_private *id_priv)
@@ -388,8 +388,7 @@ static int cma_acquire_dev(struct rdma_id_private *id_priv)
388 if (!ret) { 388 if (!ret) {
389 id_priv->id.port_num = port; 389 id_priv->id.port_num = port;
390 goto out; 390 goto out;
391 } else if (ret == 1) 391 }
392 break;
393 } 392 }
394 } 393 }
395 } 394 }