Patch "IB/cm: Fix rb-tree duplicate free and use-after-free" has been added to the 3.10-stable tree
Subsystems (2)
This is a note to let you know that I've just added the patch titled
IB/cm: Fix rb-tree duplicate free and use-after-free
to the 3.10-stable tree which can be found at:
http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary
The filename of the patch is:
ib-cm-fix-rb-tree-duplicate-free-and-use-after-free.patch
and it can be found in the queue-3.10 subdirectory.
If you, or anyone else, feels it should not be added to the stable tree, please let <[email protected]> know about it.
Quoted 1 line
From
0ca81a2840f77855bbad1b9f172c545c4dc9e6a4Mon Sep 17 00:00:00 2001
From: Doron Tsur <[email protected]>
Date: Sun, 11 Oct 2015 15:58:17 +0300
Subject: IB/cm: Fix rb-tree duplicate free and use-after-free
From: Doron Tsur <[email protected]>
commit 0ca81a2840f77855bbad1b9f172c545c4dc9e6a4 upstream.
ib_send_cm_sidr_rep could sometimes erase the node from the sidr (depending on errors in the process). Since ib_send_cm_sidr_rep is called both from cm_sidr_req_handler and cm_destroy_id, cm_id_priv could be either erased from the rb_tree twice or not erased at all. Fixing that by making sure it's erased only once before freeing cm_id_priv.
--- drivers/infiniband/core/cm.c | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-)
drivers/infiniband/core/cm.c +9 -1
@@ -857,6 +857,11 @@ retest:case IB_CM_SIDR_REQ_RCVD :spin_unlock_irq (&cm_id_priv->lock);cm_reject_sidr_req (cm_id_priv,IB_SIDR_REJECT ); +spin_lock_irq (&cm.lock); +if (!RB_EMPTY_NODE (&cm_id_priv->sidr_id_node)) +rb_erase (&cm_id_priv->sidr_id_node, + &cm.remote_sidr_table); +spin_unlock_irq (&cm.lock);break ;case IB_CM_REQ_SENT :ib_cancel_mad (cm_id_priv->av.port->mad_agent, cm_id_priv->msg);
@@ -3093,7 +3098,10 @@ int ib_send_cm_sidr_rep(struct ib_cm_idspin_unlock_irqrestore (&cm_id_priv->lock, flags);spin_lock_irqsave (&cm.lock, flags); -rb_erase (&cm_id_priv->sidr_id_node, &cm.remote_sidr_table); +if (!RB_EMPTY_NODE (&cm_id_priv->sidr_id_node)) { +rb_erase (&cm_id_priv->sidr_id_node, &cm.remote_sidr_table); +RB_CLEAR_NODE (&cm_id_priv->sidr_id_node); + }spin_unlock_irqrestore (&cm.lock, flags);return 0 ;
Patches currently in stable-queue which might be from [email protected] are
queue-3.10/ib-cm-fix-rb-tree-duplicate-free-and-use-after-free.patch