Date: Tue, 21 Jan 1997 02:10:34 +1100 (EST) From: David Nugent <davidn@unique.usn.blaze.net.au> To: FreeBSD-gnats-submit@freebsd.org Subject: kern/2535: filesize-cur resource limit reset to "infinity" Message-ID: <199701201510.CAA01575@labs.usn.blaze.net.au> Resent-Message-ID: <199701201520.HAA06270@freefall.freebsd.org>
next in thread | raw e-mail | index | archive | help
>Number: 2535 >Category: kern >Synopsis: filesize-cur resource limit reset to "infinity" >Confidential: no >Severity: serious >Priority: medium >Responsible: freebsd-bugs >State: open >Class: sw-bug >Submitter-Id: current-users >Arrival-Date: Mon Jan 20 07:20:01 PST 1997 >Last-Modified: >Originator: David Nugent - davidn@blaze.net.au >Organization: Unique Computing, Melbourne, Australia >Release: FreeBSD 3.0-CURRENT i386 >Environment: Current (since login.conf support enabled). >Description: I'm hoping that this will be fixed by some future patches by Bruce, but I'm logging it here just in case it isn't. :) Enable resource settings via /etc/login.conf as usual. Resources are all set by login(1) correctly, but after the first program is run by the shell, the "filesize" soft/current limit is reset to "infinite". This behaviour is bizarre, to say the least. >How-To-Repeat: Set resource limits in /etc/login.conf, such as: :cputime=infinity:\ :filesize=64M:\ :datasize=8M:\ :stacksize=8M:\ :coredumpsize=8M:\ :memoryuse=8M:\ :memorylocked=4M:\ :maxproc=20:\ :openfiles=20:\ :coredumpsize=infinity:\ Using tcsh in this example (same thing occurs with any shell), insert the following into /etc/csh.login BEFORE any external command is run, either directly or by backtick. echo hard limits: limit -h echo soft limits: limit Insert the same AFTER the first external command is run. Results: BEFORE AFTER hard limits: cputime unlimited cputime unlimited filesize 10240 kbytes filesize 10240 kbytes datasize 8192 kbytes datasize 8192 kbytes stacksize 8192 kbytes stacksize 8192 kbytes coredumpsize 8192 kbytes coredumpsize 8192 kbytes memoryuse 8192 kbytes memoryuse 8192 kbytes memorylocked 4096 kbytes memorylocked 4096 kbytes maxproc 20 maxproc 20 openfiles 20 openfiles 20 soft limits: cputime unlimited cputime unlimited | filesize 10240 kbytes filesize unlimited datasize 8192 kbytes datasize 8192 kbytes stacksize 8192 kbytes stacksize 8192 kbytes coredumpsize 8192 kbytes coredumpsize 8192 kbytes memoryuse 8192 kbytes memoryuse 8192 kbytes memorylocked 4096 kbytes memorylocked 4096 kbytes maxproc 20 maxproc 20 openfiles 20 openfiles 20 The vertical bar to the left highlights the mysterious change. Aside: can soft limits be *validly* set higher than hard limits like this? I wouldn't have thought so. >Fix: Remove the following line in sys/kern/kern_exit.c? I have no idea why this line is even there in the first place. :-) Can anyone explain why? --- kern_exit.c.orig Wed Jan 15 14:55:26 1997 +++ kern_exit.c Tue Jan 21 01:51:26 1997 @@ -222,7 +222,7 @@ sp->s_leader = NULL; } fixjobc(p, p->p_pgrp, 0); - p->p_rlimit[RLIMIT_FSIZE].rlim_cur = RLIM_INFINITY; + /* p->p_rlimit[RLIMIT_FSIZE].rlim_cur = RLIM_INFINITY; */ (void)acct_process(p); #ifdef KTRACE /* My first guess is that it appears to be related to the process accounting database so that the data file will not be stopped from growing by virtue of the filesize resource limit for the exiting process, which suggests that this fix is wrong, and perhaps the real fix would require saving and restoring this resource limit around the call to acct_process(). I'll leave that up to someone knows this code better than I do. Alternative (assuming the above paragraph/guess is correct): --- kern_exit.c.orig Wed Jan 15 14:55:26 1997 +++ kern_exit.c Tue Jan 21 01:57:27 1997 @@ -120,6 +120,7 @@ register struct proc *q, *nq; register struct vmspace *vm; ele_p ep = exit_list; + rlim_t fsize_cur; if (p->p_pid == 1) { printf("init died (signal %d, exit %d)\n", @@ -222,8 +223,10 @@ sp->s_leader = NULL; } fixjobc(p, p->p_pgrp, 0); - p->p_rlimit[RLIMIT_FSIZE].rlim_cur = RLIM_INFINITY; + fsize_cur = p->p_rlimit[RLIMIT_FSIZE].rlim_cur; + p->p_rlimit[RLIMIT_FSIZE].rlim_cur = RLIM_INFINITY; (void)acct_process(p); + p->p_rlimit[RLIMIT_FSIZE].rlim_cur = fsize_cur; #ifdef KTRACE /* * release trace file Should the hard limit be given similar treatment here? It also occurs to me that the wrong p->p_rlimit[RLIMIT_FSIZE].rlim_cur may be being used, which makes either fix incorrect, and the desired effect of this line ineffective. This function appears to be the kernel's exit process handler, so I have no idea why the CALLING processes resources are being modified and not those that apply to the the exiting process which I assume it should be... Help! :-) >Audit-Trail: >Unformatted:
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?199701201510.CAA01575>