Commit 81fd00e2 authored by Michael Kerrisk's avatar Michael Kerrisk Committed by Linus Torvalds

[PATCH] Off-by-one error for SIGXCPU / RLIMIT_CPU checking

There is a lonstanding off-by-one error that results from an incorrect
comparison when checking whether a process has consumed CPU time in
excess of its RLIMIT_CPU limits. 

This means, for example, that if we use setrlimit() to set the soft CPU 
limit (rlim_cur) to 5 seconds and the hard limit (rlim_max) to 10 seconds, 
then the process only receives a SIGXCPU signal after consuming 6 seconds
of CPU time, and, if it continues consuming CPU after handling that
signal, only receives SIGKILL after consuming 11 seconds of CPU time.

The fix is trivial.
Signed-off-by: default avatarLinus Torvalds <torvalds@osdl.org>
parent b0b6a9b7
...@@ -792,12 +792,12 @@ static inline void do_process_times(struct task_struct *p, ...@@ -792,12 +792,12 @@ static inline void do_process_times(struct task_struct *p,
psecs = (p->utime += user); psecs = (p->utime += user);
psecs += (p->stime += system); psecs += (p->stime += system);
if (psecs / HZ > p->rlim[RLIMIT_CPU].rlim_cur) { if (psecs / HZ >= p->rlim[RLIMIT_CPU].rlim_cur) {
/* Send SIGXCPU every second.. */ /* Send SIGXCPU every second.. */
if (!(psecs % HZ)) if (!(psecs % HZ))
send_sig(SIGXCPU, p, 1); send_sig(SIGXCPU, p, 1);
/* and SIGKILL when we go over max.. */ /* and SIGKILL when we go over max.. */
if (psecs / HZ > p->rlim[RLIMIT_CPU].rlim_max) if (psecs / HZ >= p->rlim[RLIMIT_CPU].rlim_max)
send_sig(SIGKILL, p, 1); send_sig(SIGKILL, p, 1);
} }
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment