Skip to content

Commit 6e62807

Browse files
Jinjie RuanPaolo Abeni
authored andcommitted
posix-clock: posix-clock: Fix unbalanced locking in pc_clock_settime()
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: d8794ac ("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]>
1 parent 10ce0db commit 6e62807

File tree

1 file changed

+3
-3
lines changed

1 file changed

+3
-3
lines changed

kernel/time/posix-clock.c

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -309,6 +309,9 @@ static int pc_clock_settime(clockid_t id, const struct timespec64 *ts)
309309
struct posix_clock_desc cd;
310310
int err;
311311

312+
if (!timespec64_valid_strict(ts))
313+
return -EINVAL;
314+
312315
err = get_clock_desc(id, &cd);
313316
if (err)
314317
return err;
@@ -318,9 +321,6 @@ static int pc_clock_settime(clockid_t id, const struct timespec64 *ts)
318321
goto out;
319322
}
320323

321-
if (!timespec64_valid_strict(ts))
322-
return -EINVAL;
323-
324324
if (cd.clk->ops.clock_settime)
325325
err = cd.clk->ops.clock_settime(cd.clk, ts);
326326
else

0 commit comments

Comments
 (0)