Skip to content

Commit

Permalink
posix-clock: posix-clock: Fix unbalanced locking in pc_clock_settime()
Browse files Browse the repository at this point in the history
[ Upstream commit 6e62807c7fbb3c758d233018caf94dfea9c65dbd ]

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 <[email protected]>
Signed-off-by: Jinjie Ruan <[email protected]>
Acked-by: Anna-Maria Behnsen <[email protected]>
[[email protected]: fixed commit message typo]
Signed-off-by: Paolo Abeni <[email protected]>
Signed-off-by: Sasha Levin <[email protected]>
  • Loading branch information
Jinjie Ruan authored and simonami99 committed Dec 16, 2024
1 parent 1a77639 commit f6b7267
Showing 1 changed file with 3 additions and 3 deletions.
6 changes: 3 additions & 3 deletions kernel/time/posix-clock.c
Original file line number Diff line number Diff line change
Expand Up @@ -290,6 +290,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;
Expand All @@ -299,9 +302,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
Expand Down

0 comments on commit f6b7267

Please sign in to comment.