Skip to contentSkip to conversation

time: POSIX CPU timers: Ensure that variable is initialized

PATCH In review Max R. P. Grossmann 3 participants 3 messages Jan 8, 2018 – Jan 14, 2018 Posix clocks and timers

lore
Share & tools
lore
#0 lore raw

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
index 1f27887aa194..e54638be6e19 100644
@@ -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
#1 lore raw
Quoted 7 lines · Max R. P. Grossmann

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.

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
---
 kernel/time/posix-cpu-timers.c | 3 +--
 1 file changed, 1 insertion(+), 2 deletions(-)
kernel/time/posix-cpu-timers.c +1 -2
index 1f27887aa194..e54638be6e19 100644
@@ -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
#2 lore raw

[tip:timers/core] posix-cpu-timers: Make set_process_cpu_timer() more robust

In reply to Max R. P. Grossmann
posix-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
index cef79ca..ec9f5da 100644
@@ -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