18920c5f2SDmitry Chagin /*- 28920c5f2SDmitry Chagin * Copyright (c) 2023 Dmitry Chagin <dchagin@FreeBSD.org> 38920c5f2SDmitry Chagin * 48920c5f2SDmitry Chagin * SPDX-License-Identifier: BSD-2-Clause 58920c5f2SDmitry Chagin */ 68920c5f2SDmitry Chagin 78920c5f2SDmitry Chagin #include <sys/param.h> 88920c5f2SDmitry Chagin #include <sys/sysctl.h> 98920c5f2SDmitry Chagin #include <sys/user.h> 108920c5f2SDmitry Chagin 118920c5f2SDmitry Chagin #include <assert.h> 128920c5f2SDmitry Chagin #include <libprocstat.h> 138920c5f2SDmitry Chagin #include <stdio.h> 148920c5f2SDmitry Chagin #include <stdlib.h> 158920c5f2SDmitry Chagin #include <unistd.h> 168920c5f2SDmitry Chagin 178920c5f2SDmitry Chagin int checkstack(void); 188920c5f2SDmitry Chagin 1907d3738bSEd Maste #define _STACK_FLAG_GROWS (KVME_FLAG_GROWS_UP | KVME_FLAG_GROWS_DOWN) 208920c5f2SDmitry Chagin int checkstack(void)218920c5f2SDmitry Chagincheckstack(void) 228920c5f2SDmitry Chagin { 238920c5f2SDmitry Chagin struct kinfo_vmentry *freep, *kve; 248920c5f2SDmitry Chagin struct kinfo_proc *p; 258920c5f2SDmitry Chagin struct procstat *prstat; 26*eb5fd01bSBrooks Davis uintptr_t stack; 278920c5f2SDmitry Chagin int i, cnt; 288920c5f2SDmitry Chagin 298920c5f2SDmitry Chagin prstat = procstat_open_sysctl(); 308920c5f2SDmitry Chagin assert(prstat != NULL); 318920c5f2SDmitry Chagin p = procstat_getprocs(prstat, KERN_PROC_PID, getpid(), &cnt); 328920c5f2SDmitry Chagin assert(p != NULL); 338920c5f2SDmitry Chagin freep = procstat_getvmmap(prstat, p, &cnt); 348920c5f2SDmitry Chagin assert(freep != NULL); 358920c5f2SDmitry Chagin 36*eb5fd01bSBrooks Davis stack = (uintptr_t)&i; 378920c5f2SDmitry Chagin for (i = 0; i < cnt; i++) { 388920c5f2SDmitry Chagin kve = &freep[i]; 398920c5f2SDmitry Chagin if (stack < kve->kve_start || stack > kve->kve_end) 408920c5f2SDmitry Chagin continue; 418920c5f2SDmitry Chagin if ((kve->kve_flags & _STACK_FLAG_GROWS) != 0 && 428920c5f2SDmitry Chagin (kve->kve_protection & KVME_PROT_EXEC) != 0) 438920c5f2SDmitry Chagin stack = 0; 448920c5f2SDmitry Chagin break; 458920c5f2SDmitry Chagin } 468920c5f2SDmitry Chagin 478920c5f2SDmitry Chagin free(freep); 488920c5f2SDmitry Chagin procstat_freeprocs(prstat, p); 498920c5f2SDmitry Chagin procstat_close(prstat); 508920c5f2SDmitry Chagin return (stack != 0); 518920c5f2SDmitry Chagin } 52