diff options
| author | Andrew Morton <akpm@osdl.org> | 2006-03-24 03:18:35 -0800 | 
|---|---|---|
| committer | Greg Kroah-Hartman <gregkh@suse.de> | 2006-04-17 13:16:06 -0700 | 
| commit | 284a7c99c01846ee44040268529c99fc92dcc531 (patch) | |
| tree | 73722b8f455d37ce6160cebc90f6d2734ce7aee4 /kernel | |
| parent | bc5bd8ac3c6956c7ce2c838e8e2f01435b8e4e0b (diff) | |
[PATCH] RLIMIT_CPU: fix handling of a zero limit
At present the kernel doesn't honour an attempt to set RLIMIT_CPU to zero
seconds.  But the spec says it should, and that's what 2.4.x does.
Fixing this for real would involve some complexity (such as adding a new
it-has-been-set flag to the task_struct, and testing that everwhere, instead
of overloading the value of it_prof_expires).
Given that a 2.4 kernel won't actually send the signal until one second has
expired anyway, let's just handle this case by treating the caller's
zero-seconds as one second.
Cc: Martin Schwidefsky <schwidefsky@de.ibm.com>
Cc: Ulrich Weigand <uweigand@de.ibm.com>
Cc: Cliff Wickman <cpw@sgi.com>
Acked-by: Ingo Molnar <mingo@elte.hu>
Signed-off-by: Andrew Morton <akpm@osdl.org>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>
Diffstat (limited to 'kernel')
| -rw-r--r-- | kernel/sys.c | 14 | 
1 files changed, 13 insertions, 1 deletions
| diff --git a/kernel/sys.c b/kernel/sys.c index f91218a5463e..105e102e1c4a 100644 --- a/kernel/sys.c +++ b/kernel/sys.c @@ -1657,7 +1657,19 @@ asmlinkage long sys_setrlimit(unsigned int resource, struct rlimit __user *rlim)  	    (cputime_eq(current->signal->it_prof_expires, cputime_zero) ||  	     new_rlim.rlim_cur <= cputime_to_secs(  		     current->signal->it_prof_expires))) { -		cputime_t cputime = secs_to_cputime(new_rlim.rlim_cur); +		unsigned long rlim_cur = new_rlim.rlim_cur; +		cputime_t cputime; + +		if (rlim_cur == 0) { +			/* +			 * The caller is asking for an immediate RLIMIT_CPU +			 * expiry.  But we use the zero value to mean "it was +			 * never set".  So let's cheat and make it one second +			 * instead +			 */ +			rlim_cur = 1; +		} +		cputime = secs_to_cputime(rlim_cur);  		read_lock(&tasklist_lock);  		spin_lock_irq(¤t->sighand->siglock);  		set_process_cpu_timer(current, CPUCLOCK_PROF, | 
