]> git.hungrycats.org Git - linux/commitdiff
[PATCH] Off-by-one error for SIGXCPU / RLIMIT_CPU checking
authorMichael Kerrisk <michael.kerrisk@gmx.net>
Mon, 2 Aug 2004 03:31:12 +0000 (20:31 -0700)
committerLinus Torvalds <torvalds@ppc970.osdl.org>
Mon, 2 Aug 2004 03:31:12 +0000 (20:31 -0700)
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: Linus Torvalds <torvalds@osdl.org>
kernel/timer.c

index 56b315bc53cf1b409ba460f09d769dcf6ce29b9c..4850abbeacdce6cc2f472d1258469ec78d2d5e1e 100644 (file)
@@ -792,12 +792,12 @@ static inline void do_process_times(struct task_struct *p,
 
        psecs = (p->utime += user);
        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.. */
                if (!(psecs % HZ))
                        send_sig(SIGXCPU, p, 1);
                /* 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);
        }
 }