[67300de] | 1 | Submitted By: Jim Gifford <jim@linuxfromscratch.org>
|
---|
| 2 | Date: 07-14-2006
|
---|
| 3 | Initial Package Version: 0.97
|
---|
| 4 | Upstream Status: Unknown
|
---|
| 5 | Origin: Grub Bug Report - http://savannah.gnu.org/bugs/?func=detailitem&item_id=11312
|
---|
| 6 | Description: This patch fixes the following issues on x86_64
|
---|
| 7 | 1) malloc'd pages seem to lack the execute bit on x86_64;
|
---|
| 8 | 2) grub seems to use some stack pointer diversion to malloc'd pages;
|
---|
| 9 | 3) nested functions execute data on the stack;
|
---|
| 10 | 4) this causes a segfault (at least on my machine)
|
---|
| 11 |
|
---|
| 12 | diff -Naur grub-0.97.orig/grub/asmstub.c grub-0.97/grub/asmstub.c
|
---|
| 13 | --- grub-0.97.orig/grub/asmstub.c 2005-02-16 12:45:14.000000000 -0800
|
---|
| 14 | +++ grub-0.97/grub/asmstub.c 2006-07-14 12:38:08.305902933 -0700
|
---|
| 15 | @@ -43,6 +43,8 @@
|
---|
| 16 | #include <termios.h>
|
---|
| 17 | #include <signal.h>
|
---|
| 18 |
|
---|
| 19 | +#include <sys/mman.h>
|
---|
| 20 | +
|
---|
| 21 | #ifdef __linux__
|
---|
| 22 | # include <sys/ioctl.h> /* ioctl */
|
---|
| 23 | # if !defined(__GLIBC__) || \
|
---|
| 24 | @@ -142,14 +144,25 @@
|
---|
| 25 | }
|
---|
| 26 |
|
---|
| 27 | assert (grub_scratch_mem == 0);
|
---|
| 28 | - scratch = malloc (0x100000 + EXTENDED_MEMSIZE + 15);
|
---|
| 29 | + scratch = mmap(NULL,
|
---|
| 30 | + 0x100000 + EXTENDED_MEMSIZE + 15,
|
---|
| 31 | + PROT_EXEC | PROT_READ | PROT_WRITE,
|
---|
| 32 | + MAP_PRIVATE | MAP_GROWSDOWN | MAP_ANONYMOUS | MAP_32BIT,
|
---|
| 33 | + -1,
|
---|
| 34 | + 0);
|
---|
| 35 | +
|
---|
| 36 | assert (scratch);
|
---|
| 37 | grub_scratch_mem = (char *) ((((int) scratch) >> 4) << 4);
|
---|
| 38 |
|
---|
| 39 | /* FIXME: simulate the memory holes using mprot, if available. */
|
---|
| 40 |
|
---|
| 41 | assert (disks == 0);
|
---|
| 42 | - disks = malloc (NUM_DISKS * sizeof (*disks));
|
---|
| 43 | + disks = mmap(NULL,
|
---|
| 44 | + NUM_DISKS * sizeof (*disks),
|
---|
| 45 | + PROT_EXEC | PROT_READ | PROT_WRITE,
|
---|
| 46 | + MAP_PRIVATE | MAP_GROWSDOWN | MAP_ANONYMOUS | MAP_32BIT,
|
---|
| 47 | + -1,
|
---|
| 48 | + 0);
|
---|
| 49 | assert (disks);
|
---|
| 50 | /* Initialize DISKS. */
|
---|
| 51 | for (i = 0; i < NUM_DISKS; i++)
|
---|
| 52 | @@ -215,9 +228,9 @@
|
---|
| 53 | /* Release memory. */
|
---|
| 54 | restore_device_map (device_map);
|
---|
| 55 | device_map = 0;
|
---|
| 56 | - free (disks);
|
---|
| 57 | + munmap(disks, NUM_DISKS * sizeof (*disks));
|
---|
| 58 | disks = 0;
|
---|
| 59 | - free (scratch);
|
---|
| 60 | + munmap(scratch, 0x100000 + EXTENDED_MEMSIZE + 15);
|
---|
| 61 | grub_scratch_mem = 0;
|
---|
| 62 |
|
---|
| 63 | if (serial_device)
|
---|