File CVE-2010-2240-address_space_limit.patch of Package xorg-x11-server

From: Matthieu Herrb <matthieu.herrb@laas.fr>
Date: Mon, 28 Jun 2010 23:54:13 +0200
Subject: [PATCH] Workaround for CVE-2010-2240.

By limiting the address space that the X server can use,
it prevents stack and mmap()ed areas to become so close that
the stack will grow over a mmaped area.

Credits: Rafal Wojtczuk <rafal@invisiblethingslab.com>

diff --git a/doc/Xserver.man.pre b/doc/Xserver.man.pre
index ce3b3a1..91c595f 100644
--- a/doc/Xserver.man.pre
+++ b/doc/Xserver.man.pre
@@ -285,6 +285,13 @@ sets the stack space limit of the server to the specified number of kilobytes.
 A value of zero makes the stack size as large as possible.  The default value
 of \-1 leaves the stack space limit unchanged.
 .TP 8
+.B \-la \fIkilobytes\fP
+sets the address space limit of the server to the specified number of 
+kilobytes.
+A value of zero makes address space as large as possible.
+The default value is 1572864 (1.5GB) on 32 bit architectures and
+10485760 (10GB) on 64 bit architectures.
+.TP 8
 .B \-logo
 turns on the X Window System logo display in the screen-saver.
 There is currently no way to change this from a client.
--- xorg-server-1.6.5/include/opaque.h.orig	2009-10-12 02:52:40.000000000 +0000
+++ xorg-server-1.6.5/include/opaque.h	2010-08-17 08:52:06.000000000 +0000
@@ -67,6 +67,9 @@ extern int limitStackSpace;
 #ifdef RLIMIT_NOFILE
 extern int limitNoFile;
 #endif
+#ifdef RLIMIT_AS
+extern int limitAddressSpace;
+#endif
 extern Bool defeatAccessControl;
 extern long maxBigRequestSize;
 extern Bool party_like_its_1989;
--- xorg-server-1.6.5/os/osinit.c.orig	2009-10-12 02:52:40.000000000 +0000
+++ xorg-server-1.6.5/os/osinit.c	2010-08-17 08:56:57.000000000 +0000
@@ -87,6 +87,14 @@ int limitStackSpace = -1;
 #ifdef RLIMIT_NOFILE
 int limitNoFile = -1;
 #endif
+#ifdef RLIMIT_AS
+#ifdef _XSERVER64
+#define XORG_AS_LIMIT 10737418240LL
+#else
+#define XORG_AS_LIMIT 1610612736
+#endif
+long limitAddressSpace = XORG_AS_LIMIT;
+#endif
 
 void
 OsInit(void)
@@ -187,6 +195,22 @@ OsInit(void)
 	    }
 	}
 #endif
+#ifdef RLIMIT_AS
+	if (limitAddressSpace >= 0)
+	{
+	    struct rlimit	rlim;
+
+	    if (!getrlimit(RLIMIT_AS, &rlim))
+	    {
+		if ((limitAddressSpace > 0) 
+		    && (limitAddressSpace < rlim.rlim_max))
+		    rlim.rlim_cur = limitAddressSpace;
+		else
+		    rlim.rlim_cur = rlim.rlim_max;
+		(void)setrlimit(RLIMIT_AS, &rlim);
+	    }
+	}
+#endif
 #ifdef SERVER_LOCK
 	LockServer();
 #endif
--- xorg-server-1.6.5/os/utils.c.orig	2009-10-12 02:52:40.000000000 +0000
+++ xorg-server-1.6.5/os/utils.c	2010-08-17 08:55:15.000000000 +0000
@@ -761,6 +761,22 @@ ProcessCommandLine(int argc, char *argv[
 		UseMsg();
 	}
 #endif
+#ifdef RLIMIT_AS
+	else if ( strcmp( argv[i], "-la") == 0)
+	{
+	    if (getuid() != geteuid()) {
+		FatalError("The '-la' option can only be used by root.\n");
+	    }
+	    if(++i < argc)
+	    {
+		limitAddressSpace = atol(argv[i]);
+		if (limitAddressSpace > 0)
+		    limitAddressSpace *= 1024;
+	    }
+	    else
+		UseMsg();
+	}
+#endif
 #ifdef SERVER_LOCK
 	else if ( strcmp ( argv[i], "-nolock") == 0)
 	{
openSUSE Build Service is sponsored by