]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
posix-clock: posix-clock: Fix unbalanced locking in pc_clock_settime()
authorJinjie Ruan <ruanjinjie@huawei.com>
Fri, 18 Oct 2024 10:07:48 +0000 (18:07 +0800)
committerPaolo Abeni <pabeni@redhat.com>
Wed, 23 Oct 2024 14:05:01 +0000 (16:05 +0200)
If get_clock_desc() succeeds, it calls fget() for the clockid's fd,
and get the clk->rwsem read lock, so the error path should release
the lock to make the lock balance and fput the clockid's fd to make
the refcount balance and release the fd related resource.

However the below commit left the error path locked behind resulting in
unbalanced locking. Check timespec64_valid_strict() before
get_clock_desc() to fix it, because the "ts" is not changed
after that.

Fixes: d8794ac20a29 ("posix-clock: Fix missing timespec64 check in pc_clock_settime()")
Acked-by: Richard Cochran <richardcochran@gmail.com>
Signed-off-by: Jinjie Ruan <ruanjinjie@huawei.com>
Acked-by: Anna-Maria Behnsen <anna-maria@linutronix.de>
[pabeni@redhat.com: fixed commit message typo]
Signed-off-by: Paolo Abeni <pabeni@redhat.com>
kernel/time/posix-clock.c

index 316a4e8c97d362730aa38033034e3819a36ceb35..1af0bb2cc45c0aab843f77eb156992de469c8fb9 100644 (file)
@@ -309,6 +309,9 @@ static int pc_clock_settime(clockid_t id, const struct timespec64 *ts)
        struct posix_clock_desc cd;
        int err;
 
+       if (!timespec64_valid_strict(ts))
+               return -EINVAL;
+
        err = get_clock_desc(id, &cd);
        if (err)
                return err;
@@ -318,9 +321,6 @@ static int pc_clock_settime(clockid_t id, const struct timespec64 *ts)
                goto out;
        }
 
-       if (!timespec64_valid_strict(ts))
-               return -EINVAL;
-
        if (cd.clk->ops.clock_settime)
                err = cd.clk->ops.clock_settime(cd.clk, ts);
        else