time: POSIX CPU timers: Ensure that variable is initialized
PATCH 1/1 time: POSIX CPU timers: Ensure that variable is initialized
If cpu_timer_sample_group returns -EINVAL, it will not have written into *sample. Checking for cpu_timer_sample_group's return value precludes the potential use of an uninitialized value of now in the following block. Given an invalid clock_idx, the previous code could otherwise overwrite *oldval in an undefined manner. This is now prevented. We also exploit short-circuiting of && to sample the timer only if the result will actually be used to update *oldval.
--- kernel/time/posix-cpu-timers.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-)
kernel/time/posix-cpu-timers.c +1 -2
@@ -1189,9 +1189,8 @@ void set_process_cpu_timer(struct task_struct *tsk, unsigned int clock_idx,u64 now;WARN_ON_ONCE (clock_idx ==CPUCLOCK_SCHED ); -cpu_timer_sample_group (clock_idx, tsk, &now); -if (oldval) { +if (oldval &&cpu_timer_sample_group (clock_idx, tsk, &now) != -EINVAL ) {/* * We are setting itimer. The *oldval is absolute and we update * it to be relative, *newval argument is relative and we update
Signature · 1 line
2.15.1
Quoted 7 lines · Max R. P. Grossmann
If
cpu_timer_sample_groupreturns-EINVAL, it will not have written into *sample. Checking for cpu_timer_sample_group's return value precludes the potential use of an uninitialized value of now in the following block. Given an invalidclock_idx, the previous code could otherwise overwrite *oldval in an undefined manner. This is now prevented. We also exploit short-circuiting of && to sample the timer only if the result will actually be used to update *oldval.
Sure the explanation makes sense, though you should have mentioned that _ALL_ current users call this function with a valid clockid.
I'll amend the changelog.
Quoted 24 lines
Signed-off-by Max R. P. Grossmann <[email protected]>--- kernel/time/posix-cpu-timers.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-)kernel/time/posix-cpu-timers.c +1
-2@@ -1189,9 +1189,8 @@ void set_process_cpu_timer(struct task_struct *tsk, unsigned int clock_idx,u64 now;WARN_ON_ONCE (clock_idx ==CPUCLOCK_SCHED ); -cpu_timer_sample_group (clock_idx, tsk, &now); -if (oldval) { +if (oldval &&cpu_timer_sample_group (clock_idx, tsk, &now) != -EINVAL ) {/* * We are setting itimer. The *oldval is absolute and we update * it to be relative, *newval argument is relative and we update Signature · 1 line
2.15.1
tip-bot for Max R. P. Grossmann
merge bot[tip:timers/core] posix-cpu-timers: Make set_process_cpu_timer() more robust
In reply to Max R. P. Grossmannposix-cpu-timers: Make set_process_cpu_timer() more robust
Commit-ID: a9445e47d897054876b8f43e46dc5a3eca2b844d Gitweb: https://git.kernel.org/tip/a9445e47d897054876b8f43e46dc5a3eca2b844d Author: Max R. P. Grossmann <[email protected]> AuthorDate: Mon, 8 Jan 2018 20:01:57 +0100 Committer: Thomas Gleixner <[email protected]> CommitDate: Sun, 14 Jan 2018 20:50:59 +0100
posix-cpu-timers: Make set_process_cpu_timer() more robust
Because the return value of cpu_timer_sample_group() is not checked, compilers and static checkers can legitimately warn about a potential use of the uninitialized variable 'now'. This is not a runtime issue as all call sites hand in valid clock ids.
Also cpu_timer_sample_group() is invoked unconditionally even when the result is not used because *oldval is NULL.
Make the invocation conditional and check the return value.
[ tglx: Massage changelog ]
--- kernel/time/posix-cpu-timers.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-)
kernel/time/posix-cpu-timers.c +1 -2
@@ -1189,9 +1189,8 @@ void set_process_cpu_timer(struct task_struct *tsk, unsigned int clock_idx,u64 now;WARN_ON_ONCE (clock_idx ==CPUCLOCK_SCHED ); -cpu_timer_sample_group (clock_idx, tsk, &now); -if (oldval) { +if (oldval &&cpu_timer_sample_group (clock_idx, tsk, &now) != -EINVAL ) {/* * We are setting itimer. The *oldval is absolute and we update * it to be relative, *newval argument is relative and we update