From e57964bfdb5da997e0691f7ab83dad28317d9563 Mon Sep 17 00:00:00 2001 From: Alan Cox Date: Mon, 3 Sep 2018 21:21:26 +0100 Subject: [PATCH] syscall_proc: make brk() error more useful, stop brk below base --- Kernel/syscall_proc.c | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/Kernel/syscall_proc.c b/Kernel/syscall_proc.c index 93b10358..17bbc7a0 100644 --- a/Kernel/syscall_proc.c +++ b/Kernel/syscall_proc.c @@ -227,15 +227,21 @@ arg_t _brk(void) can keep it portable */ if (addr >= brk_limit()) { - kprintf("%d: out of memory\n", udata.u_ptab->p_pid); + kprintf("%d: out of memory by %d\n", udata.u_ptab->p_pid, + addr - brk_limit()); udata.u_error = ENOMEM; return -1; } +#if (PROGBASE > 0) + if (addr < PROGBASE) { + udata.u_error = EINVAL; + return -1; + } +#endif /* If we have done a break that gives us more room we must zero the extra as we no longer guarantee it is clear already */ if (addr > udata.u_break) uzero((void *)udata.u_break, addr - udata.u_break); - /* FIXME: review can brk() below base address */ udata.u_break = addr; return 0; } -- 2.34.1