]> git.pld-linux.org Git - packages/xorg-xserver-server.git/commitdiff
- nx vm86 fix
authorArkadiusz Miśkiewicz <arekm@maven.pl>
Fri, 21 Nov 2008 18:06:14 +0000 (18:06 +0000)
committercvs2git <feedback@pld-linux.org>
Sun, 24 Jun 2012 12:13:13 +0000 (12:13 +0000)
Changed files:
    xorg-xserver-server-vm86-nx.patch -> 1.1

xorg-xserver-server-vm86-nx.patch [new file with mode: 0644]

diff --git a/xorg-xserver-server-vm86-nx.patch b/xorg-xserver-server-vm86-nx.patch
new file mode 100644 (file)
index 0000000..070d45d
--- /dev/null
@@ -0,0 +1,49 @@
+commit a9e20306fbe3262602f21b876a52a1ef38cdf20a
+Author: Egbert Eich <eich@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,
This page took 0.0444 seconds and 4 git commands to generate.