public inbox for linux-kernel@vger.kernel.org
 help / color / mirror / Atom feed
* Off by one error for SIGXCPURLMIC_CPU checking
@ 2004-08-02 13:10 Michael Kerrisk
  0 siblings, 0 replies; only message in thread
From: Michael Kerrisk @ 2004-08-02 13:10 UTC (permalink / raw)
  To: akpm; +Cc: linux-kernel, torvalds, michael.kerrisk

Hello Andrew,

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, and included below.

Cheers,

Michael


--- /spare/KERNEL/linux-2.6.7/kernel/timer.c	2004-06-16 07:19:52.000000000 
+0200
+++ /spare/KERNEL/linux-2.6.7-xcpu/kernel/timer.c	2004-08-02 
09:34:10.000000000 +0200
@@ -792,12 +792,12 @@
 
 	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);
 	}
 }


^ permalink raw reply	[flat|nested] only message in thread

only message in thread, other threads:[~2004-08-02 13:11 UTC | newest]

Thread overview: (only message) (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2004-08-02 13:10 Off by one error for SIGXCPURLMIC_CPU checking Michael Kerrisk

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox