syscall_proc: make brk() error more useful, stop brk below base
authorAlan Cox <alan@linux.intel.com>
Mon, 3 Sep 2018 20:21:26 +0000 (21:21 +0100)
committerAlan Cox <alan@linux.intel.com>
Mon, 3 Sep 2018 20:21:26 +0000 (21:21 +0100)
Kernel/syscall_proc.c

index 93b1035..17bbc7a 100644 (file)
@@ -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;
 }