From: Bang Nguyen Date: Mon, 17 Jun 2013 18:53:15 +0000 (-0700) Subject: RDMA CM: Avoid possible SEGV during connection shutdown X-Git-Tag: v4.1.12-92~293^2~1^2~17 X-Git-Url: https://www.infradead.org/git/?a=commitdiff_plain;h=5c25b3ad05ae4e42b0700ff63ca3598da5b6fdfb;p=users%2Fjedix%2Flinux-maple.git RDMA CM: Avoid possible SEGV during connection shutdown cma_release_port() may be called twice for the same rdma id during connection shutdown, causing hlist_del() to SEGV. Orabug: 16750726 Signed-off-by: Chien-Hua Yen (cherry picked from commit cfee888ccacc233d2045a26492ed92a25d468927) Signed-off-by: Mukesh Kacker --- diff --git a/drivers/infiniband/core/cma.c b/drivers/infiniband/core/cma.c index c2445f9047a2..f48e4501ef97 100644 --- a/drivers/infiniband/core/cma.c +++ b/drivers/infiniband/core/cma.c @@ -1039,13 +1039,16 @@ static void cma_cancel_operation(struct rdma_id_private *id_priv, static void cma_release_port(struct rdma_id_private *id_priv) { - struct rdma_bind_list *bind_list = id_priv->bind_list; - - if (!bind_list) - return; + struct rdma_bind_list *bind_list; mutex_lock(&lock); + bind_list = id_priv->bind_list; + if (!bind_list) { + mutex_unlock(&lock); + return; + } hlist_del(&id_priv->node); + id_priv->bind_list = NULL; if (hlist_empty(&bind_list->owners)) { idr_remove(bind_list->ps, bind_list->port); kfree(bind_list);