From: Andrew Morton 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 kenrel 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 Cc: Ulrich Weigand Cc: Cliff Wickman Signed-off-by: Andrew Morton --- kernel/sys.c | 13 ++++++++++++- 1 files changed, 12 insertions(+), 1 deletion(-) diff -puN kernel/sys.c~rlimit_cpu-fix-handling-of-a-zero-limit kernel/sys.c --- devel/kernel/sys.c~rlimit_cpu-fix-handling-of-a-zero-limit 2006-02-16 01:24:50.000000000 -0800 +++ devel-akpm/kernel/sys.c 2006-02-16 01:24:50.000000000 -0800 @@ -1661,8 +1661,19 @@ asmlinkage long sys_setrlimit(unsigned i it_prof_secs = cputime_to_secs(current->signal->it_prof_expires); if (it_prof_secs == 0 || new_rlim.rlim_cur <= it_prof_secs) { - 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, &cputime, NULL); _