posix-cpu-timers: Ensure set_process_cpu_timer is always evaluated
PATCH 1/1 posix-cpu-timers: Ensure set_process_cpu_timer is always evaluated
Commit a9445e47d897 ("posix-cpu-timers: Make set_process_cpu_timer() more robust") moved the check into the 'if' statement. Unfortunately, it did so on the right side of an && which means that it may get short circuited and never evaluated. This is easily reproduced with:
$ cat loop.c
void main() {
struct rlimit res;
/* set the CPU time limit */
getrlimit(RLIMIT_CPU,&res);
res.rlim_cur = 2;
res.rlim_max = 2;
setrlimit(RLIMIT_CPU,&res); while (1);
}
Which will hang forever instead of being killed. Fix this by pulling the evaluation out of the if statement but checking the return value instead.
Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=1568337
--- kernel/time/posix-cpu-timers.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-)
kernel/time/posix-cpu-timers.c +3 -1
@@ -1187,10 +1187,12 @@ void set_process_cpu_timer(struct task_struct *tsk, unsigned int clock_idx, u64 *newval, u64 *oldval) {u64 now; +int ret;WARN_ON_ONCE (clock_idx ==CPUCLOCK_SCHED ); + ret =cpu_timer_sample_group (clock_idx, tsk, &now); -if (oldval &&cpu_timer_sample_group (clock_idx, tsk, &now) != -EINVAL ) { +if (oldval && ret != -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.17.0
tip-bot for Laura Abbott
merge botposix-cpu-timers: Ensure set_process_cpu_timer is always evaluated
Commit-ID: c3bca5d450b620dd3d36e14b5e1f43639fd47d6b Gitweb: https://git.kernel.org/tip/c3bca5d450b620dd3d36e14b5e1f43639fd47d6b Author: Laura Abbott <[email protected]> AuthorDate: Tue, 17 Apr 2018 14:57:42 -0700 Committer: Thomas Gleixner <[email protected]> CommitDate: Thu, 19 Apr 2018 12:54:57 +0200
posix-cpu-timers: Ensure set_process_cpu_timer is always evaluated
Commit a9445e47d897 ("posix-cpu-timers: Make set_process_cpu_timer() more robust") moved the check into the 'if' statement. Unfortunately, it did so on the right side of an && which means that it may get short circuited and never evaluated. This is easily reproduced with:
$ cat loop.c
void main() {
struct rlimit res;
/* set the CPU time limit */
getrlimit(RLIMIT_CPU,&res);
res.rlim_cur = 2;
res.rlim_max = 2;
setrlimit(RLIMIT_CPU,&res); while (1);
}
Which will hang forever instead of being killed. Fix this by pulling the evaluation out of the if statement but checking the return value instead.
Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=1568337
--- kernel/time/posix-cpu-timers.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-)
kernel/time/posix-cpu-timers.c +3 -1
@@ -1205,10 +1205,12 @@ void set_process_cpu_timer(struct task_struct *tsk, unsigned int clock_idx, u64 *newval, u64 *oldval) {u64 now; +int ret;WARN_ON_ONCE (clock_idx ==CPUCLOCK_SCHED ); + ret =cpu_timer_sample_group (clock_idx, tsk, &now); -if (oldval &&cpu_timer_sample_group (clock_idx, tsk, &now) != -EINVAL ) { +if (oldval && ret != -EINVAL ) {/* * We are setting itimer. The *oldval is absolute and we update * it to be relative, *newval argument is relative and we update