git: 18c5a26f8a74 - main - vm_map_growstack(): give a hint to user that stack was blown out
- Go to: [ bottom of page ] [ top of archives ] [ this month ]
Date: Thu, 07 May 2026 17:00:58 UTC
The branch main has been updated by kib:
URL: https://cgit.FreeBSD.org/src/commit/?id=18c5a26f8a747583b9bca3a6a1ae9db1ed4591a3
commit 18c5a26f8a747583b9bca3a6a1ae9db1ed4591a3
Author: Konstantin Belousov <kib@FreeBSD.org>
AuthorDate: 2026-05-06 22:53:59 +0000
Commit: Konstantin Belousov <kib@FreeBSD.org>
CommitDate: 2026-05-07 17:00:14 +0000
vm_map_growstack(): give a hint to user that stack was blown out
Reviewed by: markj
Sponsored by: The FreeBSD Foundation
MFC after: 1 week
Differential revision: https://reviews.freebsd.org/D56863
---
sys/vm/vm_map.c | 17 +++++++++++++++--
1 file changed, 15 insertions(+), 2 deletions(-)
diff --git a/sys/vm/vm_map.c b/sys/vm/vm_map.c
index 0a81e62d2d63..7ead7d7e6472 100644
--- a/sys/vm/vm_map.c
+++ b/sys/vm/vm_map.c
@@ -4723,6 +4723,11 @@ vm_map_stack_locked(vm_map_t map, vm_offset_t addrbos, vm_size_t max_ssize,
return (rv);
}
+static bool report_stackoverflow = true;
+SYSCTL_BOOL(_vm, OID_AUTO, report_stackoverflow, CTLFLAG_RWTUN,
+ &report_stackoverflow, 0,
+ "uprintf() on stack overflow");
+
/*
* Attempts to grow a vm stack entry. Returns KERN_SUCCESS if we
* successfully grow the stack.
@@ -4787,8 +4792,12 @@ retry:
if (guard > max_grow)
return (KERN_NO_SPACE);
max_grow -= guard;
- if (grow_amount > max_grow)
+ if (grow_amount > max_grow) {
+ if (report_stackoverflow)
+ uprintf("pid %d comm %s tid %d stack overflow\n",
+ p->p_pid, p->p_comm, td->td_tid);
return (KERN_NO_SPACE);
+ }
/*
* If this is the main process stack, see if we're over the stack
@@ -4796,8 +4805,12 @@ retry:
*/
is_procstack = addr >= (vm_offset_t)vm->vm_maxsaddr &&
addr < (vm_offset_t)vm->vm_stacktop;
- if (is_procstack && (ctob(vm->vm_ssize) + grow_amount > stacklim))
+ if (is_procstack && (ctob(vm->vm_ssize) + grow_amount > stacklim)) {
+ if (report_stackoverflow)
+ uprintf("pid %d comm %s tid %d stack overflow\n",
+ p->p_pid, p->p_comm, td->td_tid);
return (KERN_NO_SPACE);
+ }
#ifdef RACCT
if (racct_enable) {