diff options
| author | Maurizio Lombardi <mlombard@redhat.com> | 2026-08-13 15:18:50 +0200 |
|---|---|---|
| committer | Keith Busch <kbusch@kernel.org> | 2026-08-13 09:26:44 -0700 |
| commit | f1a8846e06388113dfdbb89dee005083fa9afdf9 (patch) | |
| tree | 666765a71b3a16497a6629a64835d54367284f93 /include | |
| parent | 22eb631bf86ee3246f47885e4fa94154a46863e4 (diff) | |
| download | linux-stable-f1a8846e06388113dfdbb89dee005083fa9afdf9.tar.gz linux-stable-f1a8846e06388113dfdbb89dee005083fa9afdf9.zip | |
nvmet: fix max_qid race between configfs and controller allocation
The function nvmet_subsys_attr_qid_max_store() can race against
nvmet_alloc_ctrl() when a subsystem's max_qid limit is modified.
Suppose max_qid is currently 64. If nvmet_alloc_ctrl() executes:
ctrl->sqs = kzalloc_objs(struct nvmet_sq *, subsys->max_qid + 1);
and at this exact point, a userspace process changes max_qid to 128,
nvmet_subsys_attr_qid_max_store() will set the new max_qid value. It
attempts to delete active controllers to force a reconnect, but the
new controller won't be deleted because it hasn't been added to the
subsys->ctrls list yet.
nvmet_alloc_ctrl() then proceeds and adds the new controller to the
subsys->ctrls list. Later, when nvmet_install_queue() is called, it
will see max_qid set to 128, but the memory allocated for sqs is only
sized for 64 entries. This results in a KASAN out-of-bounds warning
and potential memory corruptions.
Fix this by protecting the queue allocations and list insertion in
nvmet_alloc_ctrl() with down_read(&nvmet_config_sem). Because
nvmet_subsys_attr_qid_max_store() acquires down_write(&nvmet_config_sem)
to modify the attribute, this safely prevents the configfs writer from
modifying max_qid during controller creation.
Copy the max_qid from the subsystem to the controller's structure
during the allocation; ctrl->max_qid never changes as long as the
controller remains in LIVE state, so this will prevent similar race
conditions.
Fixes: 3e980f5995e0 ("nvmet: expose max queues to configfs")
Reported-by: syzbot+2626e846cd2585c9aa67@syzkaller.appspotmail.com
Signed-off-by: Maurizio Lombardi <mlombard@redhat.com>
Signed-off-by: Keith Busch <kbusch@kernel.org>
Diffstat (limited to 'include')
0 files changed, 0 insertions, 0 deletions
