[OE-core] [PATCH] Fix X server on PowerPC when using GCC 4.7.x

Gary Thomas gary at mlbassoc.com
Wed May 16 13:09:23 UTC 2012


The function XaceHook() was trying to do something like this:
   void *ptr;
   switch(XX) {
      case a:
         define_some_structure A;
         ptr = &A;
         break;
      case b:
         define_some_structure B;
         ptr = &B;
         break;
   }
   call_some_function(ptr);

Clearly this is not even legal - the scope of the variables A & B
is not well defined outside of the switch cases.  This code pattern
stopped working on PowerPC with GCC >= 4.7.1 (it has worked forever
up to & including 4.6.3).  Replace this sequence with legal code:
   switch(XX) {
      case a:
         define_some_structure A;
         call_some_function(&A);
         break;
      case b:
         define_some_structure B;
         call_some_function(&B);
         break;
   }
---
 .../fix-bogus-stack-variables.patch                |  130 ++++++++++++++++++++
 .../xorg-xserver/xserver-kdrive_1.7.99.2.bb        |    3 +-
 2 files changed, 132 insertions(+), 1 deletions(-)
 create mode 100644 meta/recipes-graphics/xorg-xserver/xserver-kdrive-1.7.99.2/fix-bogus-stack-variables.patch

diff --git a/meta/recipes-graphics/xorg-xserver/xserver-kdrive-1.7.99.2/fix-bogus-stack-variables.patch b/meta/recipes-graphics/xorg-xserver/xserver-kdrive-1.7.99.2/fix-bogus-stack-variables.patch
new file mode 100644
index 0000000..0946dfb
--- /dev/null
+++ b/meta/recipes-graphics/xorg-xserver/xserver-kdrive-1.7.99.2/fix-bogus-stack-variables.patch
@@ -0,0 +1,130 @@
+Index: xorg-server-1.7.99.2/Xext/xace.c
+===================================================================
+--- xorg-server-1.7.99.2.orig/Xext/xace.c
++++ xorg-server-1.7.99.2/Xext/xace.c
+@@ -87,8 +87,7 @@ void XaceHookAuditEnd(ClientPtr ptr, int
+  */
+ int XaceHook(int hook, ...)
+ {
+-    pointer calldata;	/* data passed to callback */
+-    int *prv = NULL;	/* points to return value from callback */
++    int res = Success;
+     va_list ap;		/* argument list */
+     va_start(ap, hook);
+ 
+@@ -109,8 +108,8 @@ int XaceHook(int hook, ...)
+ 	    rec.parent = va_arg(ap, pointer);
+ 	    rec.access_mode = va_arg(ap, Mask);
+ 	    rec.status = Success; /* default allow */
+-	    calldata = &rec;
+-	    prv = &rec.status;
++	    CallCallbacks(&XaceHooks[hook], &rec);
++	    res = rec.status;
+ 	    break;
+ 	}
+ 	case XACE_DEVICE_ACCESS: {
+@@ -119,8 +118,8 @@ int XaceHook(int hook, ...)
+ 	    rec.dev = va_arg(ap, DeviceIntPtr);
+ 	    rec.access_mode = va_arg(ap, Mask);
+ 	    rec.status = Success; /* default allow */
+-	    calldata = &rec;
+-	    prv = &rec.status;
++	    CallCallbacks(&XaceHooks[hook], &rec);
++	    res = rec.status;
+ 	    break;
+ 	}
+ 	case XACE_SEND_ACCESS: {
+@@ -131,8 +130,8 @@ int XaceHook(int hook, ...)
+ 	    rec.events = va_arg(ap, xEventPtr);
+ 	    rec.count = va_arg(ap, int);
+ 	    rec.status = Success; /* default allow */
+-	    calldata = &rec;
+-	    prv = &rec.status;
++	    CallCallbacks(&XaceHooks[hook], &rec);
++	    res = rec.status;
+ 	    break;
+ 	}
+ 	case XACE_RECEIVE_ACCESS: {
+@@ -142,8 +141,8 @@ int XaceHook(int hook, ...)
+ 	    rec.events = va_arg(ap, xEventPtr);
+ 	    rec.count = va_arg(ap, int);
+ 	    rec.status = Success; /* default allow */
+-	    calldata = &rec;
+-	    prv = &rec.status;
++	    CallCallbacks(&XaceHooks[hook], &rec);
++	    res = rec.status;
+ 	    break;
+ 	}
+ 	case XACE_CLIENT_ACCESS: {
+@@ -152,8 +151,8 @@ int XaceHook(int hook, ...)
+ 	    rec.target = va_arg(ap, ClientPtr);
+ 	    rec.access_mode = va_arg(ap, Mask);
+ 	    rec.status = Success; /* default allow */
+-	    calldata = &rec;
+-	    prv = &rec.status;
++	    CallCallbacks(&XaceHooks[hook], &rec);
++	    res = rec.status;
+ 	    break;
+ 	}
+ 	case XACE_EXT_ACCESS: {
+@@ -162,8 +161,8 @@ int XaceHook(int hook, ...)
+ 	    rec.ext = va_arg(ap, ExtensionEntry*);
+ 	    rec.access_mode = DixGetAttrAccess;
+ 	    rec.status = Success; /* default allow */
+-	    calldata = &rec;
+-	    prv = &rec.status;
++	    CallCallbacks(&XaceHooks[hook], &rec);
++	    res = rec.status;
+ 	    break;
+ 	}
+ 	case XACE_SERVER_ACCESS: {
+@@ -171,8 +170,8 @@ int XaceHook(int hook, ...)
+ 	    rec.client = va_arg(ap, ClientPtr);
+ 	    rec.access_mode = va_arg(ap, Mask);
+ 	    rec.status = Success; /* default allow */
+-	    calldata = &rec;
+-	    prv = &rec.status;
++	    CallCallbacks(&XaceHooks[hook], &rec);
++	    res = rec.status;
+ 	    break;
+ 	}
+ 	case XACE_SCREEN_ACCESS:
+@@ -182,15 +181,15 @@ int XaceHook(int hook, ...)
+ 	    rec.screen = va_arg(ap, ScreenPtr);
+ 	    rec.access_mode = va_arg(ap, Mask);
+ 	    rec.status = Success; /* default allow */
+-	    calldata = &rec;
+-	    prv = &rec.status;
++	    CallCallbacks(&XaceHooks[hook], &rec);
++	    res = rec.status;
+ 	    break;
+ 	}
+ 	case XACE_AUTH_AVAIL: {
+ 	    XaceAuthAvailRec rec;
+ 	    rec.client = va_arg(ap, ClientPtr);
+ 	    rec.authId = va_arg(ap, XID);
+-	    calldata = &rec;
++	    CallCallbacks(&XaceHooks[hook], &rec);
+ 	    break;
+ 	}
+ 	case XACE_KEY_AVAIL: {
+@@ -198,7 +197,7 @@ int XaceHook(int hook, ...)
+ 	    rec.event = va_arg(ap, xEventPtr);
+ 	    rec.keybd = va_arg(ap, DeviceIntPtr);
+ 	    rec.count = va_arg(ap, int);
+-	    calldata = &rec;
++	    CallCallbacks(&XaceHooks[hook], &rec);
+ 	    break;
+ 	}
+ 	default: {
+@@ -208,9 +207,7 @@ int XaceHook(int hook, ...)
+     }
+     va_end(ap);
+  
+-    /* call callbacks and return result, if any. */
+-    CallCallbacks(&XaceHooks[hook], calldata);
+-    return prv ? *prv : Success;
++    return res;
+ }
+ 
+ /* XaceCensorImage
diff --git a/meta/recipes-graphics/xorg-xserver/xserver-kdrive_1.7.99.2.bb b/meta/recipes-graphics/xorg-xserver/xserver-kdrive_1.7.99.2.bb
index 360a0f3..dc17e2b 100644
--- a/meta/recipes-graphics/xorg-xserver/xserver-kdrive_1.7.99.2.bb
+++ b/meta/recipes-graphics/xorg-xserver/xserver-kdrive_1.7.99.2.bb
@@ -7,7 +7,7 @@ RDEPENDS_${PN} += "xkeyboard-config"
 EXTRA_OECONF += "--disable-glx"
 
 PE = "1"
-PR = "r29"
+PR = "r30"
 
 SRC_URI = "${XORG_MIRROR}/individual/xserver/xorg-server-${PV}.tar.bz2 \
 	file://extra-kmodes.patch \
@@ -21,6 +21,7 @@ SRC_URI = "${XORG_MIRROR}/individual/xserver/xorg-server-${PV}.tar.bz2 \
 	file://crosscompile.patch \
 	file://error-address-work-around.patch \
 	file://nodolt.patch"
+        file://fix-bogus-stack-variables.patch \
 #	file://kdrive-evdev.patch
 #	file://kdrive-use-evdev.patch
 #	file://enable-builtin-fonts.patch
-- 
1.7.7.6





More information about the Openembedded-core mailing list