r2007 - / trunk/patches

jim at linuxfromscratch.org jim at linuxfromscratch.org
Fri Jul 14 15:02:35 PDT 2006


Author: jim
Date: 2006-07-14 16:02:35 -0600 (Fri, 14 Jul 2006)
New Revision: 2007

Added:
   trunk/patches/grub-0.97-use_mmap-1.patch
Modified:
   /
Log:
 r4604 at server (orig r2127):  jim | 2006-07-14 14:42:45 -0700
 Added: grub-0.97-use_mmap-1.patch



Property changes on: 
___________________________________________________________________
Name: svk:merge
   - b6734a72-470d-0410-b049-f317dca95413:/:2125
   + b6734a72-470d-0410-b049-f317dca95413:/:2127

Added: trunk/patches/grub-0.97-use_mmap-1.patch
===================================================================
--- trunk/patches/grub-0.97-use_mmap-1.patch	                        (rev 0)
+++ trunk/patches/grub-0.97-use_mmap-1.patch	2006-07-14 22:02:35 UTC (rev 2007)
@@ -0,0 +1,63 @@
+Submitted By: Jim Gifford <jim at linuxfromscratch.org>
+Date: 07-14-2006
+Initial Package Version: 0.97
+Upstream Status: Unknown
+Origin: Grub Bug Report - http://savannah.gnu.org/bugs/?func=detailitem&item_id=11312
+Description: This patch fixes the following issues on x86_64
+	1) malloc'd pages seem to lack the execute bit on x86_64;
+	2) grub seems to use some stack pointer diversion to malloc'd pages;
+	3) nested functions execute data on the stack;
+	4) this causes a segfault (at least on my machine)
+
+diff -Naur grub-0.97.orig/grub/asmstub.c grub-0.97/grub/asmstub.c
+--- grub-0.97.orig/grub/asmstub.c	2005-02-16 12:45:14.000000000 -0800
++++ grub-0.97/grub/asmstub.c	2006-07-14 12:38:08.305902933 -0700
+@@ -43,6 +43,8 @@
+ #include <termios.h>
+ #include <signal.h>
+ 
++#include <sys/mman.h>
++
+ #ifdef __linux__
+ # include <sys/ioctl.h>		/* ioctl */
+ # if !defined(__GLIBC__) || \
+@@ -142,14 +144,25 @@
+     }
+ 
+   assert (grub_scratch_mem == 0);
+-  scratch = malloc (0x100000 + EXTENDED_MEMSIZE + 15);
++  scratch = mmap(NULL,
++                 0x100000 + EXTENDED_MEMSIZE + 15,
++                 PROT_EXEC | PROT_READ | PROT_WRITE,
++                 MAP_PRIVATE | MAP_GROWSDOWN | MAP_ANONYMOUS | MAP_32BIT,
++                 -1,
++                 0);
++
+   assert (scratch);
+   grub_scratch_mem = (char *) ((((int) scratch) >> 4) << 4);
+ 
+   /* FIXME: simulate the memory holes using mprot, if available. */
+ 
+   assert (disks == 0);
+-  disks = malloc (NUM_DISKS * sizeof (*disks));
++  disks = mmap(NULL,
++               NUM_DISKS * sizeof (*disks),
++               PROT_EXEC | PROT_READ | PROT_WRITE,
++               MAP_PRIVATE | MAP_GROWSDOWN | MAP_ANONYMOUS | MAP_32BIT,
++               -1,
++               0);
+   assert (disks);
+   /* Initialize DISKS.  */
+   for (i = 0; i < NUM_DISKS; i++)
+@@ -215,9 +228,9 @@
+   /* Release memory. */
+   restore_device_map (device_map);
+   device_map = 0;
+-  free (disks);
++  munmap(disks, NUM_DISKS * sizeof (*disks));
+   disks = 0;
+-  free (scratch);
++  munmap(scratch, 0x100000 + EXTENDED_MEMSIZE + 15);
+   grub_scratch_mem = 0;
+ 
+   if (serial_device)




More information about the cross-lfs mailing list