freebsd-dev/sys/kern
Bruce Evans 6bfb820292 Quick fix for stack overflow when there are more than about 25 slices.
Using recursion to traverse the recursive data structure for extended
partitions was never good, but when slice support was implemented in
1995, the recursion worked for the default maximum number of slices
(32), and standard fdisk utilities didn't support creating more than
the default number.  Even then, corrupt extended partitions could
cause endless recursion, because we attempt to check all slices, even
ones which we don't turn into devices.

The recursion has succumbed to creeping features.  The stack requirements
for each level had grown to 204 bytes on i386's.  Most of the growth was
caused by adding a 64-byte copy of the DOSpartition table to each frame.
The kernel stack size has shrunk to about 5K on i386's.  Most of the
shrinkage was caused by the growth of `struct sigacts' by 2388 bytes
to support 128 signals.

Linux fdisk (a 1997 version at least) can now create 60 slices (4 standard
ones, 56 for logical drives within extended partitions, and it seems to
be leaving room to map the 4 BSD partitions on my test drive), and Linux
(2.2.29 and 2.3.35 at least) now reports all these slices at boot time.

The fix limits the recursion to 16 levels (4 + 16 slices) and recovers
32 bytes per level caused by gcc pessimizing for space.  Switching to
a static buffer doesn't cause any problems due to recursion, since the
buffer is not passed down.  Using a static buffer is wrong in general
because it requires the giant lock to protect it.  However, this problem
is small compared with using a static buffer for dsname().  We sometimes
neglect to copy the result of dsname() before sleeping.

Also fixed slice names when we find more than MAX_SLICES (32) slices.
The number of the last slice found was not passed passed recursively.
The limit on the recursion now prevents finding more than 32 slices
with a standard extended partition data structure anyway.
2000-01-27 05:11:29 +00:00
..
bus_if.m * Add struct resource_list* argument to resource_list_alloc and 1999-10-12 21:35:51 +00:00
device_if.m $Id$ -> $FreeBSD$ 1999-08-28 01:08:13 +00:00
imgact_aout.c s/p_cred->pc_ucred/p_ucred/g 1999-11-21 12:38:21 +00:00
imgact_elf.c Changed the type used to represent the user stack pointer from `long *' 1999-12-27 10:42:55 +00:00
imgact_gzip.c useracc() the prequel: 1999-10-29 18:09:36 +00:00
imgact_shell.c $Id$ -> $FreeBSD$ 1999-08-28 01:08:13 +00:00
inflate.c Change #ifdef KERNEL to #ifdef _KERNEL in the public headers. "KERNEL" 1999-12-29 05:07:58 +00:00
init_main.c If we fail to find init, print out the search path used. This helps 1999-12-20 02:50:49 +00:00
init_sysent.c Fix bde'isms in acl/extattr syscall interface, renaming syscalls to 2000-01-19 06:02:31 +00:00
kern_acct.c Introduce NDFREE (and remove VOP_ABORTOP) 1999-12-15 23:02:35 +00:00
kern_acl.c Fix bde'isms in acl/extattr syscall interface, renaming syscalls to 2000-01-19 06:07:34 +00:00
kern_clock.c Make adjtime(2) adjust boottime so it doesn't cause non-monotonous 1999-12-08 10:02:12 +00:00
kern_conf.c Backout previous commit. It was a mistake. 2000-01-23 15:47:46 +00:00
kern_descrip.c Fix the style bugs in the style bugs fix. The style bug fix made the 2000-01-21 06:57:52 +00:00
kern_environment.c Change the prototype of the strto* routines to make the second 1999-11-24 01:03:08 +00:00
kern_exec.c When we are execing a setugid program, and we have a procfs filesystem 2000-01-20 07:12:52 +00:00
kern_exit.c Handle the case where we truss an SUGID program -- in particular, we need 2000-01-10 04:09:05 +00:00
kern_fork.c Put on my asbestos underwear and commit the patch that I posted to -arch 1999-12-06 11:13:50 +00:00
kern_intr.c Trim unused options (or #ifdef for undoc options). 1999-10-11 15:19:12 +00:00
kern_jail.c Add a version number field to the jail(2) argument so that future changes 1999-09-19 08:36:03 +00:00
kern_kthread.c Panic if proc0 hasn't been created and we try to call kthread_create. 2000-01-10 08:00:58 +00:00
kern_ktrace.c Introduce NDFREE (and remove VOP_ABORTOP) 1999-12-15 23:02:35 +00:00
kern_linker.c Introduce NDFREE (and remove VOP_ABORTOP) 1999-12-15 23:02:35 +00:00
kern_lock.c Lock reporting and assertion changes. 1999-12-11 16:13:02 +00:00
kern_lockf.c Commit the remaining part of PR14914: 1999-11-16 16:28:58 +00:00
kern_malloc.c KAME netinet6 basic part(no IPsec,no V6 Multicast Forwarding, no UDP/TCP 1999-11-22 02:45:11 +00:00
kern_mib.c Trim unused options (or #ifdef for undoc options). 1999-10-11 15:19:12 +00:00
kern_module.c A hack basically.. We have a bunch of code that used to call 1999-11-08 06:53:30 +00:00
kern_ntptime.c Add a couple of strategic sysctls for monitoring. 2000-01-23 14:52:37 +00:00
kern_physio.c Change useracc() and kernacc() to use VM_PROT_{READ|WRITE|EXECUTE} for the 1999-10-30 06:32:05 +00:00
kern_proc.c Add a sysctl to control if argv is disclosed to the world: 1999-11-26 08:27:16 +00:00
kern_prot.c Implement setres[ug]id() and getres[ug]id(). This has been sitting in 2000-01-16 16:34:26 +00:00
kern_random.c Trim some unused #includes 1999-10-11 15:00:09 +00:00
kern_resource.c Add a bit of sanity checking and problem avoidance in case the 1999-11-29 11:29:04 +00:00
kern_shutdown.c Seconds to ticks conversion was done at the wrong place. 2000-01-12 17:26:42 +00:00
kern_sig.c Introduce NDFREE (and remove VOP_ABORTOP) 1999-12-15 23:02:35 +00:00
kern_subr.c useracc() the prequel: 1999-10-29 18:09:36 +00:00
kern_switch.c Fix a typo and a bug. 1999-08-19 16:06:08 +00:00
kern_synch.c Don't make the ktrace hook in tsleep() deref a null curproc after a panic. 1999-11-30 09:01:46 +00:00
kern_syscalls.c Trim unused options (or #ifdef for undoc options). 1999-10-11 15:19:12 +00:00
kern_sysctl.c Separate some common sysctl code into sysctl_find_oid() and calling 1999-12-01 02:25:19 +00:00
kern_tc.c Make adjtime(2) adjust boottime so it doesn't cause non-monotonous 1999-12-08 10:02:12 +00:00
kern_threads.c $Id$ -> $FreeBSD$ 1999-08-28 01:08:13 +00:00
kern_time.c Change useracc() and kernacc() to use VM_PROT_{READ|WRITE|EXECUTE} for the 1999-10-30 06:32:05 +00:00
kern_timeout.c Restructure TCP timeout handling: 1999-08-30 21:17:07 +00:00
kern_xxx.c $Id$ -> $FreeBSD$ 1999-08-28 01:08:13 +00:00
ksched.c Fixed some type mismatches. p_retval[0] in struct proc has type 1999-12-27 10:22:09 +00:00
link_aout.c Fixed a cast of a pointer to an integer of a possibly different size. 1999-12-24 15:33:36 +00:00
link_elf_obj.c Fixed a cast of a pointer to an integer of a possibly different size. 1999-12-24 15:33:36 +00:00
link_elf.c Fixed a cast of a pointer to an integer of a possibly different size. 1999-12-24 15:33:36 +00:00
Make.tags.inc Add soft updates to the set of things being tagged. Syntax cleanup. 2000-01-27 01:22:06 +00:00
makedevops.pl Fix some bugs in user-end output and add a reference to the original 1999-11-22 14:40:04 +00:00
Makefile ${MACHINE} -> ${MACHINE_ARCH} 1999-11-14 13:54:44 +00:00
makesyscalls.sh Second pass commit to introduce new ACL and Extended Attribute system 1999-12-19 06:08:07 +00:00
md5c.c Change #ifdef KERNEL to #ifdef _KERNEL in the public headers. "KERNEL" 1999-12-29 05:07:58 +00:00
p1003_1b.c Well folks, this is it - The second stage of the removal for build support 1999-04-17 08:36:07 +00:00
posix4_mib.c * Change sysctl from using linker_set to construct its tree using SLISTs. 1999-02-16 10:49:55 +00:00
subr_acl_posix1e.c Fix bde'isms in acl/extattr syscall interface, renaming syscalls to 2000-01-19 06:07:34 +00:00
subr_autoconf.c Removal of sys/device.h 1999-10-05 21:19:41 +00:00
subr_blist.c Change #ifdef KERNEL to #ifdef _KERNEL in the public headers. "KERNEL" 1999-12-29 05:07:58 +00:00
subr_bus.c * Set the devclass of a device before calling the probe method. This allows 1999-12-24 16:21:15 +00:00
subr_clist.c $Id$ -> $FreeBSD$ 1999-08-28 01:08:13 +00:00
subr_devstat.c This is a partial commit of the patch from PR 14914: 1999-11-16 10:56:05 +00:00
subr_disk.c Also handle zero return from dscheck(). 2000-01-10 12:21:39 +00:00
subr_disklabel.c Removed diskerr()'s unused d_name arg and updated callers. This fixes 1999-09-13 12:59:41 +00:00
subr_diskmbr.c Quick fix for stack overflow when there are more than about 25 slices. 2000-01-27 05:11:29 +00:00
subr_diskslice.c Cleanup some more remaining bdev fluff. 2000-01-16 09:25:34 +00:00
subr_eventhandler.c Commit the remaining part of PR14914: 1999-11-16 16:28:58 +00:00
subr_log.c Remove five now unused fields from struct cdevsw. They should never 1999-09-25 18:24:47 +00:00
subr_module.c Trim unused options (or #ifdef for undoc options). 1999-10-11 15:19:12 +00:00
subr_param.c This is Bosko Milekic's mbuf allocation waiting code. Basically, this 1999-12-12 05:52:51 +00:00
subr_prf.c $Id$ -> $FreeBSD$ 1999-08-28 01:08:13 +00:00
subr_prof.c Unremove used includes. 1999-10-12 02:54:23 +00:00
subr_rman.c Commit the remaining part of PR14914: 1999-11-16 16:28:58 +00:00
subr_scanf.c Change the prototype of the strto* routines to make the second 1999-11-24 01:03:08 +00:00
subr_smp.c Allow SMP systems with an MCA bus to work properly. 2000-01-13 09:09:02 +00:00
subr_trap.c Add a new mechanism, cndbctl(), to tell the console driver that 2000-01-11 14:54:01 +00:00
subr_xxx.c Remove five now unused fields from struct cdevsw. They should never 1999-09-25 18:24:47 +00:00
sys_generic.c Add aio_waitcomplete(). Make aio work correctly for socket descriptors. 2000-01-14 02:53:29 +00:00
sys_pipe.c Use vfs_timestamp() instead of getnanotime() to set timestamps. This 1999-12-26 13:04:52 +00:00
sys_process.c Introduce the new function 1999-11-21 19:03:20 +00:00
sys_socket.c Update socket file type for fo_stat(). soo_stat() becomes a fileops 1999-11-08 03:31:01 +00:00
syscalls.c Fix bde'isms in acl/extattr syscall interface, renaming syscalls to 2000-01-19 06:02:31 +00:00
syscalls.master Fix bde'isms in acl/extattr syscall interface, renaming syscalls to 2000-01-19 06:01:07 +00:00
sysv_ipc.c $Id$ -> $FreeBSD$ 1999-08-28 01:08:13 +00:00
sysv_msg.c $Id$ -> $FreeBSD$ 1999-08-28 01:08:13 +00:00
sysv_sem.c $Id$ -> $FreeBSD$ 1999-08-28 01:08:13 +00:00
sysv_shm.c useracc() the prequel: 1999-10-29 18:09:36 +00:00
tty_compat.c $Id$ -> $FreeBSD$ 1999-08-28 01:08:13 +00:00
tty_conf.c Now that Netgraph is in the system there are some cleanups we can do. 1999-10-23 04:28:11 +00:00
tty_cons.c Don't follow null pointers if we somehow have a null devswitch entry 2000-01-25 09:20:08 +00:00
tty_pty.c Revert peter's commit to remove cdevsw_add() - it was a bit premature 1999-11-21 02:54:54 +00:00
tty_snoop.c Remove cdevsw_add() - the make_dev() calls are already there. 1999-11-18 06:39:47 +00:00
tty_subr.c $Id$ -> $FreeBSD$ 1999-08-28 01:08:13 +00:00
tty_tb.c $Id$ -> $FreeBSD$ 1999-08-28 01:08:13 +00:00
tty_tty.c Remove five now unused fields from struct cdevsw. They should never 1999-09-25 18:24:47 +00:00
tty.c This is a partial commit of the patch from PR 14914: 1999-11-16 10:56:05 +00:00
uipc_domain.c $Id$ -> $FreeBSD$ 1999-08-28 01:08:13 +00:00
uipc_mbuf.c Actively limit the allocation of mbufs to NMBUFS/nmbufs and mbuf clusters 1999-12-28 06:35:57 +00:00
uipc_proto.c Trim unused options (or #ifdef for undoc options). 1999-10-11 15:19:12 +00:00
uipc_sockbuf.c Add aio_waitcomplete(). Make aio work correctly for socket descriptors. 2000-01-14 02:53:29 +00:00
uipc_socket2.c Add aio_waitcomplete(). Make aio work correctly for socket descriptors. 2000-01-14 02:53:29 +00:00
uipc_socket.c Add aio_waitcomplete(). Make aio work correctly for socket descriptors. 2000-01-14 02:53:29 +00:00
uipc_syscalls.c This is Bosko Milekic's mbuf allocation waiting code. Basically, this 1999-12-12 05:52:51 +00:00
uipc_usrreq.c Introduce NDFREE (and remove VOP_ABORTOP) 1999-12-15 23:02:35 +00:00
vfs_acl.c Fix bde'isms in acl/extattr syscall interface, renaming syscalls to 2000-01-19 06:07:34 +00:00
vfs_aio.c Back out the previous spl change, since it opens a race window. 2000-01-20 08:15:13 +00:00
vfs_bio.c Need to reset the buffer pointer to avoid reconsidering the same buffer 2000-01-18 02:13:26 +00:00
vfs_cache.c Before we start to mess with the VFS name-cache clean things up a little bit: 1999-10-03 12:18:29 +00:00
vfs_cluster.c useracc() the prequel: 1999-10-29 18:09:36 +00:00
vfs_conf.c Put on asbestos suit and put a splcam() around the 'Mounting root from..' 1999-12-12 16:34:43 +00:00
vfs_default.c Fix bde'isms in acl/extattr syscall interface, renaming syscalls to 2000-01-19 06:07:34 +00:00
vfs_export.c Give vn_isdisk() a second argument where it can return a suitable errno. 2000-01-10 12:04:27 +00:00
vfs_extattr.c Add bwillwrite to all system calls that create things in the filesystem. 2000-01-10 00:08:53 +00:00
vfs_init.c The sysctl mod_xx hack is no longer required now that we have totally 1999-12-12 16:30:34 +00:00
vfs_lookup.c Introduce NDFREE (and remove VOP_ABORTOP) 1999-12-15 23:02:35 +00:00
vfs_mount.c Put on asbestos suit and put a splcam() around the 'Mounting root from..' 1999-12-12 16:34:43 +00:00
vfs_subr.c Give vn_isdisk() a second argument where it can return a suitable errno. 2000-01-10 12:04:27 +00:00
vfs_syscalls.c Add bwillwrite to all system calls that create things in the filesystem. 2000-01-10 00:08:53 +00:00
vfs_vnops.c Give vn_isdisk() a second argument where it can return a suitable errno. 2000-01-10 12:04:27 +00:00
vnode_if.pl Use a seperate -c and -h mode. The vnode_if.c file is compiled only into 1999-12-12 16:43:05 +00:00
vnode_if.src Second pass commit to introduce new ACL and Extended Attribute system 1999-12-19 06:08:07 +00:00