ports/179625: x11-servers/xorg-server built with clang does not work, needs USE_GCC=any

Dimitry Andric dim at FreeBSD.org
Mon Jun 17 21:20:02 UTC 2013


The following reply was made to PR ports/179625; it has been noted by GNATS.

From: Dimitry Andric <dim at FreeBSD.org>
To: mexas at bristol.ac.uk
Cc: bug-followup at FreeBSD.org,
 Jung-uk Kim <jkim at FreeBSD.org>,
 Niclas Zeising <zeising at FreeBSD.org>
Subject: Re: ports/179625: x11-servers/xorg-server built with clang does not work, needs USE_GCC=any
Date: Mon, 17 Jun 2013 23:18:43 +0200

 --Apple-Mail=_C3BEED31-6A73-4D53-9F4C-B6B88549E1BB
 Content-Transfer-Encoding: quoted-printable
 Content-Type: text/plain;
 	charset=us-ascii
 
 On Jun 17, 2013, at 14:00, Anton Shterenlikht <mexas at bris.ac.uk> wrote:
 > The patch applied cleanly (yes, I'm still on r249781).
 > The commands you wrote also run with no problems.
 > However, rebuilding xorg-server with patched clang,
 > and removing USE_GCC, did not help. The X error
 > is still the same:
 >=20
 > (EE) Jun 17 12:51:23 NVIDIA(0): Failed to initialize default colormap
 > (EE) NVIDIA(0):  *** Aborting ***
 >=20
 > Fatal server error:
 > AddScreen/ScreenInit failed for driver 0
 
 Okay, so the optimizer was not the issue then. :-)
 
 Luckily I was able to reproduce your error, after realizing you were
 using the old X.org server (version 1.7.7).  As far as I can tell, this
 is the following bug:
 
   https://bugs.freedesktop.org/show_bug.cgi?id=3D18451
 
 which is fixed by this commit:
 
   =
 http://cgit.freedesktop.org/xorg/xserver/commit/?id=3D6dae7f3792611aace1df=
 0cca63bf50c50d93de43
 
 I'm attaching a diff for our x11-servers/xorg-server port, can you
 please try it?  E.g. from the root of your ports tree, run:
 
   patch -p0 -f -F0 -i x11-servers__xorg-server__fix-xace-callback-1.diff
 
 which should modify x11-servers/xorg-server/Makefile, and add an
 additional patch (extra-Xext-xace.c) to the files subdirectory.  Then
 rebuild and reinstall the xorg-server port.
 
 -Dimitry
 
 
 --Apple-Mail=_C3BEED31-6A73-4D53-9F4C-B6B88549E1BB
 Content-Disposition: attachment;
 	filename=x11-servers__xorg-server__fix-xace-callback-1.diff
 Content-Type: application/octet-stream;
 	name="x11-servers__xorg-server__fix-xace-callback-1.diff"
 Content-Transfer-Encoding: 7bit
 
 Index: x11-servers/xorg-server/Makefile
 ===================================================================
 --- x11-servers/xorg-server/Makefile	(revision 321017)
 +++ x11-servers/xorg-server/Makefile	(working copy)
 @@ -33,7 +33,8 @@
  		${FILESDIR}/extra-os-utils.c \
  		${FILESDIR}/extra-Xserver-hw-xfree86-os-support-bsd-sparc64_video.c \
  		${FILESDIR}/extra-Xserver-os-xprintf.c \
 -		${FILESDIR}/extra-servermd.h
 +		${FILESDIR}/extra-servermd.h \
 +		${FILESDIR}/extra-Xext-xace.c
  .endif
  
  USE_BZIP2=	yes
 Index: x11-servers/xorg-server/files/extra-Xext-xace.c
 ===================================================================
 --- x11-servers/xorg-server/files/extra-Xext-xace.c	(revision 0)
 +++ x11-servers/xorg-server/files/extra-Xext-xace.c	(working copy)
 @@ -0,0 +1,211 @@
 +--- Xext/xace.c.orig	2010-04-21 04:00:26.000000000 +0200
 ++++ Xext/xace.c	2013-06-17 23:02:08.000000000 +0200
 +@@ -87,7 +87,18 @@ void XaceHookAuditEnd(ClientPtr ptr, int
 +  */
 + int XaceHook(int hook, ...)
 + {
 +-    pointer calldata;	/* data passed to callback */
 ++    union {
 ++	XaceResourceAccessRec res;
 ++	XaceDeviceAccessRec dev;
 ++	XaceSendAccessRec send;
 ++	XaceReceiveAccessRec recv;
 ++	XaceClientAccessRec client;
 ++	XaceExtAccessRec ext;
 ++	XaceServerAccessRec server;
 ++	XaceScreenAccessRec screen;
 ++	XaceAuthAvailRec auth;
 ++	XaceKeyAvailRec key;
 ++    } u;
 +     int *prv = NULL;	/* points to return value from callback */
 +     va_list ap;		/* argument list */
 +     va_start(ap, hook);
 +@@ -99,117 +110,86 @@ int XaceHook(int hook, ...)
 +      */
 +     switch (hook)
 +     {
 +-	case XACE_RESOURCE_ACCESS: {
 +-	    XaceResourceAccessRec rec;
 +-	    rec.client = va_arg(ap, ClientPtr);
 +-	    rec.id = va_arg(ap, XID);
 +-	    rec.rtype = va_arg(ap, RESTYPE);
 +-	    rec.res = va_arg(ap, pointer);
 +-	    rec.ptype = va_arg(ap, RESTYPE);
 +-	    rec.parent = va_arg(ap, pointer);
 +-	    rec.access_mode = va_arg(ap, Mask);
 +-	    rec.status = Success; /* default allow */
 +-	    calldata = &rec;
 +-	    prv = &rec.status;
 ++	case XACE_RESOURCE_ACCESS:
 ++	    u.res.client = va_arg(ap, ClientPtr);
 ++	    u.res.id = va_arg(ap, XID);
 ++	    u.res.rtype = va_arg(ap, RESTYPE);
 ++	    u.res.res = va_arg(ap, pointer);
 ++	    u.res.ptype = va_arg(ap, RESTYPE);
 ++	    u.res.parent = va_arg(ap, pointer);
 ++	    u.res.access_mode = va_arg(ap, Mask);
 ++	    u.res.status = Success; /* default allow */
 ++	    prv = &u.res.status;
 ++	    break;
 ++	case XACE_DEVICE_ACCESS:
 ++	    u.dev.client = va_arg(ap, ClientPtr);
 ++	    u.dev.dev = va_arg(ap, DeviceIntPtr);
 ++	    u.dev.access_mode = va_arg(ap, Mask);
 ++	    u.dev.status = Success; /* default allow */
 ++	    prv = &u.dev.status;
 ++	    break;
 ++	case XACE_SEND_ACCESS:
 ++	    u.send.client = va_arg(ap, ClientPtr);
 ++	    u.send.dev = va_arg(ap, DeviceIntPtr);
 ++	    u.send.pWin = va_arg(ap, WindowPtr);
 ++	    u.send.events = va_arg(ap, xEventPtr);
 ++	    u.send.count = va_arg(ap, int);
 ++	    u.send.status = Success; /* default allow */
 ++	    prv = &u.send.status;
 ++	    break;
 ++	case XACE_RECEIVE_ACCESS:
 ++	    u.recv.client = va_arg(ap, ClientPtr);
 ++	    u.recv.pWin = va_arg(ap, WindowPtr);
 ++	    u.recv.events = va_arg(ap, xEventPtr);
 ++	    u.recv.count = va_arg(ap, int);
 ++	    u.recv.status = Success; /* default allow */
 ++	    prv = &u.recv.status;
 ++	    break;
 ++	case XACE_CLIENT_ACCESS:
 ++	    u.client.client = va_arg(ap, ClientPtr);
 ++	    u.client.target = va_arg(ap, ClientPtr);
 ++	    u.client.access_mode = va_arg(ap, Mask);
 ++	    u.client.status = Success; /* default allow */
 ++	    prv = &u.client.status;
 ++	    break;
 ++	case XACE_EXT_ACCESS:
 ++	    u.ext.client = va_arg(ap, ClientPtr);
 ++	    u.ext.ext = va_arg(ap, ExtensionEntry*);
 ++	    u.ext.access_mode = DixGetAttrAccess;
 ++	    u.ext.status = Success; /* default allow */
 ++	    prv = &u.ext.status;
 ++	    break;
 ++	case XACE_SERVER_ACCESS:
 ++	    u.server.client = va_arg(ap, ClientPtr);
 ++	    u.server.access_mode = va_arg(ap, Mask);
 ++	    u.server.status = Success; /* default allow */
 ++	    prv = &u.server.status;
 + 	    break;
 +-	}
 +-	case XACE_DEVICE_ACCESS: {
 +-	    XaceDeviceAccessRec rec;
 +-	    rec.client = va_arg(ap, ClientPtr);
 +-	    rec.dev = va_arg(ap, DeviceIntPtr);
 +-	    rec.access_mode = va_arg(ap, Mask);
 +-	    rec.status = Success; /* default allow */
 +-	    calldata = &rec;
 +-	    prv = &rec.status;
 +-	    break;
 +-	}
 +-	case XACE_SEND_ACCESS: {
 +-	    XaceSendAccessRec rec;
 +-	    rec.client = va_arg(ap, ClientPtr);
 +-	    rec.dev = va_arg(ap, DeviceIntPtr);
 +-	    rec.pWin = va_arg(ap, WindowPtr);
 +-	    rec.events = va_arg(ap, xEventPtr);
 +-	    rec.count = va_arg(ap, int);
 +-	    rec.status = Success; /* default allow */
 +-	    calldata = &rec;
 +-	    prv = &rec.status;
 +-	    break;
 +-	}
 +-	case XACE_RECEIVE_ACCESS: {
 +-	    XaceReceiveAccessRec rec;
 +-	    rec.client = va_arg(ap, ClientPtr);
 +-	    rec.pWin = va_arg(ap, WindowPtr);
 +-	    rec.events = va_arg(ap, xEventPtr);
 +-	    rec.count = va_arg(ap, int);
 +-	    rec.status = Success; /* default allow */
 +-	    calldata = &rec;
 +-	    prv = &rec.status;
 +-	    break;
 +-	}
 +-	case XACE_CLIENT_ACCESS: {
 +-	    XaceClientAccessRec rec;
 +-	    rec.client = va_arg(ap, ClientPtr);
 +-	    rec.target = va_arg(ap, ClientPtr);
 +-	    rec.access_mode = va_arg(ap, Mask);
 +-	    rec.status = Success; /* default allow */
 +-	    calldata = &rec;
 +-	    prv = &rec.status;
 +-	    break;
 +-	}
 +-	case XACE_EXT_ACCESS: {
 +-	    XaceExtAccessRec rec;
 +-	    rec.client = va_arg(ap, ClientPtr);
 +-	    rec.ext = va_arg(ap, ExtensionEntry*);
 +-	    rec.access_mode = DixGetAttrAccess;
 +-	    rec.status = Success; /* default allow */
 +-	    calldata = &rec;
 +-	    prv = &rec.status;
 +-	    break;
 +-	}
 +-	case XACE_SERVER_ACCESS: {
 +-	    XaceServerAccessRec rec;
 +-	    rec.client = va_arg(ap, ClientPtr);
 +-	    rec.access_mode = va_arg(ap, Mask);
 +-	    rec.status = Success; /* default allow */
 +-	    calldata = &rec;
 +-	    prv = &rec.status;
 +-	    break;
 +-	}
 + 	case XACE_SCREEN_ACCESS:
 +-	case XACE_SCREENSAVER_ACCESS: {
 +-	    XaceScreenAccessRec rec;
 +-	    rec.client = va_arg(ap, ClientPtr);
 +-	    rec.screen = va_arg(ap, ScreenPtr);
 +-	    rec.access_mode = va_arg(ap, Mask);
 +-	    rec.status = Success; /* default allow */
 +-	    calldata = &rec;
 +-	    prv = &rec.status;
 +-	    break;
 +-	}
 +-	case XACE_AUTH_AVAIL: {
 +-	    XaceAuthAvailRec rec;
 +-	    rec.client = va_arg(ap, ClientPtr);
 +-	    rec.authId = va_arg(ap, XID);
 +-	    calldata = &rec;
 ++	case XACE_SCREENSAVER_ACCESS:
 ++	    u.screen.client = va_arg(ap, ClientPtr);
 ++	    u.screen.screen = va_arg(ap, ScreenPtr);
 ++	    u.screen.access_mode = va_arg(ap, Mask);
 ++	    u.screen.status = Success; /* default allow */
 ++	    prv = &u.screen.status;
 ++	    break;
 ++	case XACE_AUTH_AVAIL:
 ++	    u.auth.client = va_arg(ap, ClientPtr);
 ++	    u.auth.authId = va_arg(ap, XID);
 ++	    break;
 ++	case XACE_KEY_AVAIL:
 ++	    u.key.event = va_arg(ap, xEventPtr);
 ++	    u.key.keybd = va_arg(ap, DeviceIntPtr);
 ++	    u.key.count = va_arg(ap, int);
 + 	    break;
 +-	}
 +-	case XACE_KEY_AVAIL: {
 +-	    XaceKeyAvailRec rec;
 +-	    rec.event = va_arg(ap, xEventPtr);
 +-	    rec.keybd = va_arg(ap, DeviceIntPtr);
 +-	    rec.count = va_arg(ap, int);
 +-	    calldata = &rec;
 +-	    break;
 +-	}
 +-	default: {
 ++	default:
 + 	    va_end(ap);
 + 	    return 0;	/* unimplemented hook number */
 +-	}
 +     }
 +     va_end(ap);
 +  
 +     /* call callbacks and return result, if any. */
 +-    CallCallbacks(&XaceHooks[hook], calldata);
 ++    CallCallbacks(&XaceHooks[hook], &u);
 +     return prv ? *prv : Success;
 + }
 + 
 
 --Apple-Mail=_C3BEED31-6A73-4D53-9F4C-B6B88549E1BB--


More information about the freebsd-x11 mailing list