Subject: kern/1439: stacksize rlimit value not multiple of pagesize causes execve to fail.
To: None <gnats-bugs@NetBSD.ORG>
From: None <jarle@idt.unit.no>
List: netbsd-bugs
Date: 09/05/1995 18:33:58
>Number:         1439
>Category:       kern
>Synopsis:       stacksize rlimit value not multiple of pagesize causes execve to fail.
>Confidential:   no
>Severity:       non-critical
>Priority:       medium
>Responsible:    kern-bug-people (Kernel Bug People)
>State:          open
>Class:          sw-bug
>Submitter-Id:   net
>Arrival-Date:   Tue Sep  5 13:35:00 1995
>Last-Modified:
>Originator:     
>Organization:
Free Hardware Foundation, UnLtd.
>Release:        1.0
>Environment:
	
System: NetBSD honey.idt.unit.no 1.0 NetBSD 1.0 (HONEY) #3: Mon May 8 00:07:00 MET DST 1995 jarle@honey.idt.unit.no:/local/NetBSD/src/sys/arch/i386/compile/HONEY i386


>Description:
If the value of p->p_rlimit[RLIMIT_STACK] is set to a value that is not a
multiple of the pagesize, a process' children may (will?) fail when trying
to do an execve.  As far as I can see the vm subsystem will react
negatively to such a setting when trying to set up the new program's
stack. (execve() -> vmcmd_map_zero() -> vm->allocate() -> ??).
vm_allocate() will return an KERN_NO_SPACE error code.

	
>How-To-Repeat:
Run csh and do a 'limit stacksize 512'.  Due to the way csh parses this
input it will actually set the stacksize to 0x80200, i.e. 512k + 512
bytes.  All attempts at starting new programs will now fail with an IOT
trap.  Doing a 'limit stacksize 512k' will set the stacksize to 0x80000,
i.e. 512k exactly, and starting other programs will work again.  This
behavior was observed with gdb.
	
>Fix:
There are at least three ways to fix this:  
* To make sure that the stacksize is always rounded (or truncated) to a
proper pagealigned value wherever it's being used. 
* Round/truncate the stacksize to a pagealigned value where the rlimit
is being set.  This second fix is the `quickest', but I'm not really sure
which one is the most correct one.... Among other things it will make
`limit stacksize 512' set the stacksize to 516k.
* Make the exec- and vm-subsystem deal with non-aligned address and size
values properly.
					-jarle

Second fix:
*** kern_resource.c.orig        Tue Sep  5 12:37:55 1995
--- kern_resource.c     Tue Sep  5 18:10:11 1995
***************
*** 254,257 ****
--- 254,258 ----
  
        case RLIMIT_STACK:
+               limp->rlim_cur = round_page(limp->rlim_cur);
                if (limp->rlim_cur > maxsmap)
                        limp->rlim_cur = maxsmap;

	
-- 
trigraph ??!??! die
					-- erik@naggum.no
>Audit-Trail:
>Unformatted: