Skip to contentSkip to conversation

Patch "iscsi-target: Fix use-after-free during TPG session shutdown" has been added to the 4.1-stable tree

PATCH [email protected] 1 participant 1 message Aug 8, 2015

Subsystems (2)
lore
Share & tools
lore

[email protected]

author maintainer Applied
#0 lore raw

This is a note to let you know that I've just added the patch titled

iscsi-target: Fix use-after-free during TPG session shutdown

to the 4.1-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:
iscsi-target-fix-use-after-free-during-tpg-session-shutdown.patch
and it can be found in the queue-4.1 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 417c20a9bdd1e876384127cf096d8ae8b559066c Mon Sep 17 00:00:00 2001

From: Nicholas Bellinger <[email protected]>
Date: Wed, 22 Jul 2015 00:24:09 -0700
Subject: iscsi-target: Fix use-after-free during TPG session shutdown

From: Nicholas Bellinger <[email protected]>

commit 417c20a9bdd1e876384127cf096d8ae8b559066c upstream.

This patch fixes a use-after-free bug in iscsit_release_sessions_for_tpg() where se_portal_group->session_lock was incorrectly released/re-acquired while walking the active se_portal_group->tpg_sess_list.

The can result in a NULL pointer dereference when iscsit_close_session() shutdown happens in the normal path asynchronously to this code, causing a bogus dereference of an already freed list entry to occur.

To address this bug, walk the session list checking for the same state as before, but move entries to a local list to avoid dropping the lock while walking the active list.

As before, signal using iscsi_session->session_restatement=1 for those list entries to be released locally by iscsit_free_session() code.

---
 drivers/target/iscsi/iscsi_target.c |   12 ++++++++----
 1 file changed, 8 insertions(+), 4 deletions(-)
drivers/target/iscsi/iscsi_target.c +8 -4
@@ -4776,6 +4776,7 @@ int iscsit_release_sessions_for_tpg(stru
 	struct iscsi_session *sess;
 	struct se_portal_group *se_tpg = &tpg->tpg_se_tpg;
 	struct se_session *se_sess, *se_sess_tmp;
+	LIST_HEAD(free_list);
 	int session_count = 0;
 
 	spin_lock_bh(&se_tpg->session_lock);
@@ -4797,14 +4798,17 @@ int iscsit_release_sessions_for_tpg(stru
 		}
 		atomic_set(&sess->session_reinstatement, 1);
 		spin_unlock(&sess->conn_lock);
-		spin_unlock_bh(&se_tpg->session_lock);
 
-		iscsit_free_session(sess);
-		spin_lock_bh(&se_tpg->session_lock);
+		list_move_tail(&se_sess->sess_list, &free_list);
+	}
+	spin_unlock_bh(&se_tpg->session_lock);
 
+	list_for_each_entry_safe(se_sess, se_sess_tmp, &free_list, sess_list) {
+		sess = (struct iscsi_session *)se_sess->fabric_sess_ptr;
+
+		iscsit_free_session(sess);
 		session_count++;
 	}
-	spin_unlock_bh(&se_tpg->session_lock);
 
 	pr_debug("Released %d iSCSI Session(s) from Target Portal"
 			" Group: %hu\n", session_count, tpg->tpgt);

Patches currently in stable-queue which might be from [email protected] are

queue-4.1/iscsi-target-fix-iscsit_start_kthreads-failure-oops.patch queue-4.1/qla2xxx-release-request-queue-reservation.patch queue-4.1/qla2xxx-fix-command-initialization-in-target-mode.patch queue-4.1/iscsi-target-fix-iser-explicit-logout-tx-kthread-leak.patch queue-4.1/iscsi-target-fix-use-after-free-during-tpg-session-shutdown.patch queue-4.1/qla2xxx-fix-hardware-lock-unlock-issue-causing-kernel-panic.patch queue-4.1/qla2xxx-remove-msleep-in-qlt_send_term_exchange.patch queue-4.1/qla2xxx-kill-sessions-log-out-initiator-on-rscn-and-port-down-events.patch