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

Martin Jansa martin.jansa at gmail.com
Wed May 16 13:23:06 UTC 2012


On Wed, May 16, 2012 at 3:09 PM, Gary Thomas <gary at mlbassoc.com> wrote:
> 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
>
>
> _______________________________________________
> Openembedded-core mailing list
> Openembedded-core at lists.openembedded.org
> http://lists.linuxtogo.org/cgi-bin/mailman/listinfo/openembedded-core

Isn't this better fix?
http://cgit.freedesktop.org/xorg/xserver/commit/Xext/xace.c?id=6dae7f3792611aace1df0cca63bf50c50d93de43




More information about the Openembedded-core mailing list