Patch "iscsi-target: Fix use-after-free during TPG session shutdown" has been added to the 4.1-stable tree
Subsystems (2)
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
417c20a9bdd1e876384127cf096d8ae8b559066cMon 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(strustruct 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