SOURCES: xorg-xserver-server-vm86-nx.patch (NEW) - nx vm86 fix

arekm arekm at pld-linux.org
Fri Nov 21 19:06:19 CET 2008


Author: arekm                        Date: Fri Nov 21 18:06:19 2008 GMT
Module: SOURCES                       Tag: HEAD
---- Log message:
- nx vm86 fix

---- Files affected:
SOURCES:
   xorg-xserver-server-vm86-nx.patch (NONE -> 1.1)  (NEW)

---- Diffs:

================================================================
Index: SOURCES/xorg-xserver-server-vm86-nx.patch
diff -u /dev/null SOURCES/xorg-xserver-server-vm86-nx.patch:1.1
--- /dev/null	Fri Nov 21 19:06:20 2008
+++ SOURCES/xorg-xserver-server-vm86-nx.patch	Fri Nov 21 19:06:14 2008
@@ -0,0 +1,49 @@
+commit a9e20306fbe3262602f21b876a52a1ef38cdf20a
+Author: Egbert Eich <eich at ovid.suse.de>
+Date:   Fri Nov 21 18:50:01 2008 +0100
+
+    int10: Do an mprotect(..,PROT_EXEC) on shmat()ed memory ranges.
+    
+    When the linux kernel sets the NX bit vm86 segfaults when it tries to execute
+    code in memory that is not marked EXEC. Such code gets called whenever
+    we return from a VBIOS call to signal the calling program that the call
+    is actually finished and that we are not trapping for other reasons (like
+    IO accesses).
+    Use mprotect(2) to set these memory ranges PROT_EXEC.
+
+diff --git a/hw/xfree86/os-support/linux/int10/linux.c b/hw/xfree86/os-support/linux/int10/linux.c
+index 67eb161..b15f7fd 100644
+--- a/hw/xfree86/os-support/linux/int10/linux.c
++++ b/hw/xfree86/os-support/linux/int10/linux.c
+@@ -1,6 +1,6 @@
+ /*
+  * linux specific part of the int10 module
+- * Copyright 1999, 2000, 2001, 2002, 2003, 2004 Egbert Eich
++ * Copyright 1999, 2000, 2001, 2002, 2003, 2004, 2008 Egbert Eich
+  */
+ #ifdef HAVE_XORG_CONFIG_H
+ #include <xorg-config.h>
+@@ -357,7 +357,10 @@ MapCurrentInt10(xf86Int10InfoPtr pInt)
+ 		   "shmat(low_mem) error: %s\n",strerror(errno));
+ 	return FALSE;
+     }
+-    
++    if (mprotect((void*)0, V_RAM, PROT_READ|PROT_WRITE|PROT_EXEC) != 0)
++        xf86DrvMsg(pInt->scrnIndex, X_ERROR,
++		   "Cannot set EXEC bit on low memory: %s\n", strerror(errno));
++
+     if (((linuxInt10Priv*)pInt->private)->highMem >= 0) {
+ 	addr = shmat(((linuxInt10Priv*)pInt->private)->highMem,
+ 		     (char*)HIGH_MEM, 0);
+@@ -368,6 +371,11 @@ MapCurrentInt10(xf86Int10InfoPtr pInt)
+ 		       "shmget error: %s\n",strerror(errno));
+ 	    return FALSE;
+ 	}
++	if (mprotect((void*)HIGH_MEM, HIGH_MEM_SIZE,
++		     PROT_READ|PROT_WRITE|PROT_EXEC) != 0)
++	    xf86DrvMsg(pInt->scrnIndex, X_ERROR,
++		       "Cannot set EXEC bit on high memory: %s\n",
++		       strerror(errno));
+     } else {
+ 	if ((fd = open(DEV_MEM, O_RDWR, 0)) >= 0) {
+ 	    if (mmap((void *)(V_BIOS), SYS_BIOS - V_BIOS,
================================================================


More information about the pld-cvs-commit mailing list