Re: [PATCH v2 2/2] PM: hibernate: refuse splice on /sys/power/resume
From: Rafael J. Wysocki (Intel)
Date: Wed Nov 04 2026 - 09:45:13 EST
On Tue, Nov 3, 2026 at 3:57 PM Krystian Kaniewski
<krystianmkaniewski@xxxxxxxxx> wrote:
>
> resume_store() passes the written string to lookup_bdev() before it
> tries to parse it as a device number, so the string is resolved as a
> path relative to the current directory of the writer. The syzbot
> reproducer writes a relative name from the root of an indirect autofs
> mount. Autofs writes a mount request to its daemon pipe while kernfs
> holds of->mutex. Together with a splice into a writable kernfs file,
> which takes of->mutex inside a pipe mutex, lockdep reports
>
> Chain exists of:
> &pipe->mutex --> &of->mutex --> &sbi->pipe_mutex
>
> A splice from the daemon pipe into /sys/power/resume deadlocks when
> the written path triggers a mount request. Mark the attribute with
> SYSFS_LOOKUP so that its writable opens refuse splice and use lockdep
> classes of their own. Plain read() and write() keep their behavior, and
> read-only opens retain splice support.
>
> Fixes: 1e8c813b083c ("PM: hibernate: don't use early_lookup_bdev in resume_store")
> Reported-by: syzbot+002fb7b2d0bc53bf7e75@xxxxxxxxxxxxxxxxxxxxxxxxx
> Closes: https://syzkaller.appspot.com/bug?extid=002fb7b2d0bc53bf7e75
> Suggested-by: Tejun Heo <tj@xxxxxxxxxx>
> Link: https://lore.kernel.org/r/ec0c2add83f18d7a3c726d5d219dfe42@xxxxxxxxxx
> Signed-off-by: Krystian Kaniewski <krystianmkaniewski@xxxxxxxxx>
Acked-by: Rafael J. Wysocki (Intel) <rafael@xxxxxxxxxx>
and I'm expecting this to be routed along with the first patch in the series.
Thanks!
> ---
> v2:
> - New patch. Together with patch 1, this replaces the v1 autofs change.
>
> kernel/power/hibernate.c | 3 ++-
> 1 file changed, 2 insertions(+), 1 deletion(-)
>
> diff --git a/kernel/power/hibernate.c b/kernel/power/hibernate.c
> index e365e440cd5299..9dc5a27f674fa0 100644
> --- a/kernel/power/hibernate.c
> +++ b/kernel/power/hibernate.c
> @@ -1316,7 +1316,8 @@ static ssize_t resume_store(struct kobject *kobj, struct kobj_attribute *attr,
> return n;
> }
>
> -power_attr(resume);
> +static struct kobj_attribute resume_attr =
> + __ATTR_LOOKUP(resume, 0644, resume_show, resume_store);
>
> static ssize_t resume_offset_show(struct kobject *kobj,
> struct kobj_attribute *attr, char *buf)
> --
> 2.53.0
>