All of lore.kernel.org
 help / color / mirror / Atom feed
From: Sasha Levin <sashal@kernel.org>
To: linux-kernel@vger.kernel.org, stable@vger.kernel.org
Cc: Desmond Cheong Zhi Xi <desmondcheongzx@gmail.com>,
	Jeff Layton <jlayton@kernel.org>, Sasha Levin <sashal@kernel.org>,
	linux-fsdevel@vger.kernel.org
Subject: [PATCH AUTOSEL 4.19 22/23] fcntl: fix potential deadlock for &fasync_struct.fa_lock
Date: Sun,  5 Sep 2021 21:23:21 -0400	[thread overview]
Message-ID: <20210906012322.930668-22-sashal@kernel.org> (raw)
In-Reply-To: <20210906012322.930668-1-sashal@kernel.org>

From: Desmond Cheong Zhi Xi <desmondcheongzx@gmail.com>

[ Upstream commit 2f488f698fda820f8e6fa0407630154eceb145d6 ]

There is an existing lock hierarchy of
&dev->event_lock --> &fasync_struct.fa_lock --> &f->f_owner.lock
from the following call chain:

  input_inject_event():
    spin_lock_irqsave(&dev->event_lock,...);
    input_handle_event():
      input_pass_values():
        input_to_handler():
          evdev_events():
            evdev_pass_values():
              spin_lock(&client->buffer_lock);
              __pass_event():
                kill_fasync():
                  kill_fasync_rcu():
                    read_lock(&fa->fa_lock);
                    send_sigio():
                      read_lock_irqsave(&fown->lock,...);

&dev->event_lock is HARDIRQ-safe, so interrupts have to be disabled
while grabbing &fasync_struct.fa_lock, otherwise we invert the lock
hierarchy. However, since kill_fasync which calls kill_fasync_rcu is
an exported symbol, it may not necessarily be called with interrupts
disabled.

As kill_fasync_rcu may be called with interrupts disabled (for
example, in the call chain above), we replace calls to
read_lock/read_unlock on &fasync_struct.fa_lock in kill_fasync_rcu
with read_lock_irqsave/read_unlock_irqrestore.

Signed-off-by: Desmond Cheong Zhi Xi <desmondcheongzx@gmail.com>
Signed-off-by: Jeff Layton <jlayton@kernel.org>
Signed-off-by: Sasha Levin <sashal@kernel.org>
---
 fs/fcntl.c | 5 +++--
 1 file changed, 3 insertions(+), 2 deletions(-)

diff --git a/fs/fcntl.c b/fs/fcntl.c
index e039af1872ab..dffb5245ae72 100644
--- a/fs/fcntl.c
+++ b/fs/fcntl.c
@@ -993,13 +993,14 @@ static void kill_fasync_rcu(struct fasync_struct *fa, int sig, int band)
 {
 	while (fa) {
 		struct fown_struct *fown;
+		unsigned long flags;
 
 		if (fa->magic != FASYNC_MAGIC) {
 			printk(KERN_ERR "kill_fasync: bad magic number in "
 			       "fasync_struct!\n");
 			return;
 		}
-		read_lock(&fa->fa_lock);
+		read_lock_irqsave(&fa->fa_lock, flags);
 		if (fa->fa_file) {
 			fown = &fa->fa_file->f_owner;
 			/* Don't send SIGURG to processes which have not set a
@@ -1008,7 +1009,7 @@ static void kill_fasync_rcu(struct fasync_struct *fa, int sig, int band)
 			if (!(sig == SIGURG && fown->signum == 0))
 				send_sigio(fown, fa->fa_fd, band);
 		}
-		read_unlock(&fa->fa_lock);
+		read_unlock_irqrestore(&fa->fa_lock, flags);
 		fa = rcu_dereference(fa->fa_next);
 	}
 }
-- 
2.30.2


  parent reply	other threads:[~2021-09-06  1:35 UTC|newest]

Thread overview: 25+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2021-09-06  1:23 [PATCH AUTOSEL 4.19 01/23] locking/mutex: Fix HANDOFF condition Sasha Levin
2021-09-06  1:23 ` [PATCH AUTOSEL 4.19 02/23] regmap: fix the offset of register error log Sasha Levin
2021-09-06  1:23 ` [PATCH AUTOSEL 4.19 03/23] crypto: mxs-dcp - Check for DMA mapping errors Sasha Levin
2021-09-06  1:23   ` Sasha Levin
2021-09-06  1:23 ` [PATCH AUTOSEL 4.19 04/23] sched/deadline: Fix reset_on_fork reporting of DL tasks Sasha Levin
2021-09-06  1:23 ` [PATCH AUTOSEL 4.19 05/23] power: supply: axp288_fuel_gauge: Report register-address on readb / writeb errors Sasha Levin
2021-09-06  1:23 ` [PATCH AUTOSEL 4.19 06/23] crypto: omap-sham - clear dma flags only after omap_sham_update_dma_stop() Sasha Levin
2021-09-06  1:23 ` [PATCH AUTOSEL 4.19 07/23] sched/deadline: Fix missing clock update in migrate_task_rq_dl() Sasha Levin
2021-09-06  1:23 ` [PATCH AUTOSEL 4.19 08/23] posix-cpu-timers: Force next expiration recalc after itimer reset Sasha Levin
2021-09-06  1:23 ` [PATCH AUTOSEL 4.19 09/23] hrtimer: Avoid double reprogramming in __hrtimer_start_range_ns() Sasha Levin
2021-09-06  1:23 ` [PATCH AUTOSEL 4.19 10/23] udf: Check LVID earlier Sasha Levin
2021-09-06  1:23 ` [PATCH AUTOSEL 4.19 11/23] isofs: joliet: Fix iocharset=utf8 mount option Sasha Levin
2021-09-06  1:23 ` [PATCH AUTOSEL 4.19 12/23] bcache: add proper error unwinding in bcache_device_init Sasha Levin
2021-09-06  1:23 ` [PATCH AUTOSEL 4.19 13/23] nvme-rdma: don't update queue count when failing to set io queues Sasha Levin
2021-09-06  1:23   ` Sasha Levin
2021-09-06  1:23 ` [PATCH AUTOSEL 4.19 14/23] power: supply: max17042_battery: fix typo in MAx17042_TOFF Sasha Levin
2021-09-06  1:23 ` [PATCH AUTOSEL 4.19 15/23] s390/cio: add dev_busid sysfs entry for each subchannel Sasha Levin
2021-09-06  1:23 ` [PATCH AUTOSEL 4.19 16/23] libata: fix ata_host_start() Sasha Levin
2021-09-06  1:23 ` [PATCH AUTOSEL 4.19 17/23] crypto: qat - do not ignore errors from enable_vf2pf_comms() Sasha Levin
2021-09-06  1:23 ` [PATCH AUTOSEL 4.19 18/23] crypto: qat - handle both source of interrupt in VF ISR Sasha Levin
2021-09-06  1:23 ` [PATCH AUTOSEL 4.19 19/23] crypto: qat - fix reuse of completion variable Sasha Levin
2021-09-06  1:23 ` [PATCH AUTOSEL 4.19 20/23] crypto: qat - fix naming for init/shutdown VF to PF notifications Sasha Levin
2021-09-06  1:23 ` [PATCH AUTOSEL 4.19 21/23] crypto: qat - do not export adf_iov_putmsg() Sasha Levin
2021-09-06  1:23 ` Sasha Levin [this message]
2021-09-06  1:23 ` [PATCH AUTOSEL 4.19 23/23] udf_get_extendedattr() had no boundary checks Sasha Levin

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20210906012322.930668-22-sashal@kernel.org \
    --to=sashal@kernel.org \
    --cc=desmondcheongzx@gmail.com \
    --cc=jlayton@kernel.org \
    --cc=linux-fsdevel@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=stable@vger.kernel.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.