From: Babanpreet Singh <bbnpreetsingh@gmail.com>
To: Paul Moore <paul@paul-moore.com>, Eric Paris <eparis@redhat.com>
Cc: audit@vger.kernel.org, linux-kernel@vger.kernel.org,
Babanpreet Singh <bbnpreetsingh@gmail.com>,
syzbot+39b8fea0641107a1ccee@syzkaller.appspotmail.com
Subject: [PATCH] audit: annotate the lockless read of the audit control lock owner
Date: Fri, 2 Oct 2026 01:17:12 +0000 [thread overview]
Message-ID: <20261002011712.7-1-bbnpreetsingh@gmail.com> (raw)
audit_ctl_owner_current() reads the lock owner without taking the lock
and KCSAN complains about it. Only the current task can store itself as
owner, so the check can't give a wrong answer. Mark the accesses with
READ_ONCE() and WRITE_ONCE().
Reported-by: syzbot+39b8fea0641107a1ccee@syzkaller.appspotmail.com
Closes: https://syzkaller.appspot.com/bug?extid=39b8fea0641107a1ccee
Assisted-by: Claude:claude-opus-5-5
Signed-off-by: Babanpreet Singh <bbnpreetsingh@gmail.com>
---
Paul, you looked at this race in 2022 and asked whether READ_ONCE()
was worth it and what it would cost:
https://lore.kernel.org/all/CAHC9VhTXNPWBDRoPcz-Jw=f+NNAEhxbh-ySc56CUd-ZbuboW5w@mail.gmail.com/
Compile tested only (gcc and the KCSAN instrumentation diff); I could
not reproduce the race in QEMU.
kernel/audit.c | 11 ++++++++---
1 file changed, 8 insertions(+), 3 deletions(-)
diff --git a/kernel/audit.c b/kernel/audit.c
index 631d6d4a23cfd..f8c43ac6d5b82 100644
--- a/kernel/audit.c
+++ b/kernel/audit.c
@@ -247,7 +247,7 @@ int auditd_test_task(struct task_struct *task)
void audit_ctl_lock(void)
{
mutex_lock(&audit_cmd_mutex.lock);
- audit_cmd_mutex.owner = current;
+ WRITE_ONCE(audit_cmd_mutex.owner, current);
}
/**
@@ -255,7 +255,7 @@ void audit_ctl_lock(void)
*/
void audit_ctl_unlock(void)
{
- audit_cmd_mutex.owner = NULL;
+ WRITE_ONCE(audit_cmd_mutex.owner, NULL);
mutex_unlock(&audit_cmd_mutex.lock);
}
@@ -268,7 +268,12 @@ void audit_ctl_unlock(void)
*/
static bool audit_ctl_owner_current(void)
{
- return (current == audit_cmd_mutex.owner);
+ /*
+ * Lockless read: the owner can only equal current if current set
+ * it, so another task changing the owner concurrently can never
+ * make this return the wrong answer.
+ */
+ return (current == READ_ONCE(audit_cmd_mutex.owner));
}
/**
base-commit: a8bdcf944504980635c2069b4a4cfcf677b09bbb
--
2.43.0
next reply other threads:[~2026-10-02 1:17 UTC|newest]
Thread overview: 3+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-10-02 1:17 Babanpreet Singh [this message]
2026-10-02 9:14 ` [PATCH] audit: annotate the lockless read of the audit control lock owner sashiko-bot
2026-10-02 14:44 ` Paul Moore
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=20261002011712.7-1-bbnpreetsingh@gmail.com \
--to=bbnpreetsingh@gmail.com \
--cc=audit@vger.kernel.org \
--cc=eparis@redhat.com \
--cc=linux-kernel@vger.kernel.org \
--cc=paul@paul-moore.com \
--cc=syzbot+39b8fea0641107a1ccee@syzkaller.appspotmail.com \
/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.