From ef0780b7384b1d8257698b07091dd5214d64c4c1 Mon Sep 17 00:00:00 2001 From: Eamon Walsh Date: Thu, 28 Aug 2008 23:45:17 -0400 Subject: [PATCH 1/5] Attempt getpeercon() on remote sockets as well as local ones. (cherry picked from commit 60ad8d5d05485339e89d7f1f9f1ded75de7c7ea1) --- Xext/xselinux.c | 21 ++++++++++----------- 1 file changed, 10 insertions(+), 11 deletions(-) diff --git a/Xext/xselinux.c b/Xext/xselinux.c index a47df03c2..1d3449b9a 100644 --- a/Xext/xselinux.c +++ b/Xext/xselinux.c @@ -458,6 +458,7 @@ static void SELinuxLabelClient(ClientPtr client) { XtransConnInfo ci = ((OsCommPtr)client->osPrivate)->trans_conn; + int fd = _XSERVTransGetConnectionNumber(ci); SELinuxSubjectRec *subj; SELinuxObjectRec *obj; security_context_t ctx; @@ -467,19 +468,20 @@ SELinuxLabelClient(ClientPtr client) obj = dixLookupPrivate(&client->devPrivates, objectKey); sidput(obj->sid); + /* Try to get a context from the socket */ + if (fd < 0 || getpeercon(fd, &ctx) < 0) { + /* Otherwise, fall back to a default context */ + if (selabel_lookup(label_hnd, &ctx, NULL, SELABEL_X_CLIENT) < 0) + FatalError("SELinux: failed to look up remote-client context\n"); + } + + /* For local clients, try and determine the executable name */ if (_XSERVTransIsLocal(ci)) { - int fd = _XSERVTransGetConnectionNumber(ci); struct ucred creds; socklen_t len = sizeof(creds); char path[PATH_MAX + 1]; size_t bytes; - /* For local clients, can get context from the socket */ - if (getpeercon(fd, &ctx) < 0) - FatalError("SELinux: client %d: couldn't get context from socket\n", - client->index); - - /* Try and determine the client's executable name */ memset(&creds, 0, sizeof(creds)); if (getsockopt(fd, SOL_SOCKET, SO_PEERCRED, &creds, &len) < 0) goto finish; @@ -500,10 +502,7 @@ SELinuxLabelClient(ClientPtr client) memcpy(subj->command, path, bytes); subj->command[bytes - 1] = 0; - } else - /* For remote clients, need to use a default context */ - if (selabel_lookup(label_hnd, &ctx, NULL, SELABEL_X_CLIENT) < 0) - FatalError("SELinux: failed to look up remote-client context\n"); + } finish: /* Get a SID from the context */ From 4652c51e92ab21df020f83be3dc1ca1c897f6cf9 Mon Sep 17 00:00:00 2001 From: Adam Jackson Date: Wed, 27 Aug 2008 16:05:47 -0400 Subject: [PATCH 2/5] Reimplement ShmPutImage. There's no reason to not just dispatch this straight into the GC. As a bonus, if you do so, damage wraps correctly, and thus swcursor works. The side effect is it's no longer possible to override ShmPutImage with ShmRegisterFuncs(). Also remove the (broken) damage tracking for same from EXA, since it didn't work right, and is now superfluous. (cherry picked from commit ee7c684f21d220d5e046bab31ae617a7d64d60f6) --- Xext/shm.c | 94 +++++++++++++------------------------------------ Xext/shmint.h | 3 -- exa/exa.c | 7 ---- exa/exa_accel.c | 92 ----------------------------------------------- exa/exa_priv.h | 9 ----- 5 files changed, 25 insertions(+), 180 deletions(-) diff --git a/Xext/shm.c b/Xext/shm.c index 8cf59443c..34c875274 100644 --- a/Xext/shm.c +++ b/Xext/shm.c @@ -106,7 +106,6 @@ typedef struct _ShmDesc { unsigned long size; } ShmDescRec, *ShmDescPtr; -static void miShmPutImage(XSHM_PUT_IMAGE_ARGS); static PixmapPtr fbShmCreatePixmap(XSHM_CREATE_PIXMAP_ARGS); static int ShmDetachSegment( pointer /* value */, @@ -148,8 +147,8 @@ static int shmPixFormat[MAXSCREENS]; static ShmFuncsPtr shmFuncs[MAXSCREENS]; static DestroyPixmapProcPtr destroyPixmap[MAXSCREENS]; static DevPrivateKey shmPixmapPrivate = &shmPixmapPrivate; -static ShmFuncs miFuncs = {NULL, miShmPutImage}; -static ShmFuncs fbFuncs = {fbShmCreatePixmap, fbShmPutImage}; +static ShmFuncs miFuncs = {NULL, NULL}; +static ShmFuncs fbFuncs = {fbShmCreatePixmap, NULL}; #define VERIFY_SHMSEG(shmseg,shmdesc,client) \ { \ @@ -522,70 +521,28 @@ ProcShmDetach(client) return(client->noClientException); } +/* + * If the given request doesn't exactly match PutImage's constraints, + * wrap the image in a scratch pixmap header and let CopyArea sort it out. + */ static void -miShmPutImage(dst, pGC, depth, format, w, h, sx, sy, sw, sh, dx, dy, data) - DrawablePtr dst; - GCPtr pGC; - int depth, w, h, sx, sy, sw, sh, dx, dy; - unsigned int format; - char *data; +doShmPutImage(DrawablePtr dst, GCPtr pGC, + int depth, unsigned int format, + int w, int h, int sx, int sy, int sw, int sh, int dx, int dy, + char *data) { - PixmapPtr pmap; - GCPtr putGC; - - putGC = GetScratchGC(depth, dst->pScreen); - if (!putGC) + PixmapPtr pPixmap; + + pPixmap = GetScratchPixmapHeader(dst->pScreen, w, h, depth, + BitsPerPixel(depth), + PixmapBytePad(w, depth), + data); + if (!pPixmap) return; - pmap = (*dst->pScreen->CreatePixmap)(dst->pScreen, sw, sh, depth, - CREATE_PIXMAP_USAGE_SCRATCH); - if (!pmap) - { - FreeScratchGC(putGC); - return; - } - ValidateGC((DrawablePtr)pmap, putGC); - (*putGC->ops->PutImage)((DrawablePtr)pmap, putGC, depth, -sx, -sy, w, h, 0, - (format == XYPixmap) ? XYPixmap : ZPixmap, data); - FreeScratchGC(putGC); - if (format == XYBitmap) - (void)(*pGC->ops->CopyPlane)((DrawablePtr)pmap, dst, pGC, 0, 0, sw, sh, - dx, dy, 1L); - else - (void)(*pGC->ops->CopyArea)((DrawablePtr)pmap, dst, pGC, 0, 0, sw, sh, - dx, dy); - (*pmap->drawable.pScreen->DestroyPixmap)(pmap); + pGC->ops->CopyArea((DrawablePtr)pPixmap, dst, pGC, sx, sy, sw, sh, dx, dy); + FreeScratchPixmapHeader(pPixmap); } -_X_EXPORT void -fbShmPutImage(dst, pGC, depth, format, w, h, sx, sy, sw, sh, dx, dy, data) - DrawablePtr dst; - GCPtr pGC; - int depth, w, h, sx, sy, sw, sh, dx, dy; - unsigned int format; - char *data; -{ - if ((format == ZPixmap) || (depth == 1)) - { - PixmapPtr pPixmap; - - pPixmap = GetScratchPixmapHeader(dst->pScreen, w, h, depth, - BitsPerPixel(depth), PixmapBytePad(w, depth), (pointer)data); - if (!pPixmap) - return; - if (format == XYBitmap) - (void)(*pGC->ops->CopyPlane)((DrawablePtr)pPixmap, dst, pGC, - sx, sy, sw, sh, dx, dy, 1L); - else - (void)(*pGC->ops->CopyArea)((DrawablePtr)pPixmap, dst, pGC, - sx, sy, sw, sh, dx, dy); - FreeScratchPixmapHeader(pPixmap); - } - else - miShmPutImage(dst, pGC, depth, format, w, h, sx, sy, sw, sh, dx, dy, - data); -} - - #ifdef PANORAMIX static int ProcPanoramiXShmPutImage(register ClientPtr client) @@ -940,13 +897,12 @@ ProcShmPutImage(client) shmdesc->addr + stuff->offset + (stuff->srcY * length)); else - (*shmFuncs[pDraw->pScreen->myNum]->PutImage)( - pDraw, pGC, stuff->depth, stuff->format, - stuff->totalWidth, stuff->totalHeight, - stuff->srcX, stuff->srcY, - stuff->srcWidth, stuff->srcHeight, - stuff->dstX, stuff->dstY, - shmdesc->addr + stuff->offset); + doShmPutImage(pDraw, pGC, stuff->depth, stuff->format, + stuff->totalWidth, stuff->totalHeight, + stuff->srcX, stuff->srcY, + stuff->srcWidth, stuff->srcHeight, + stuff->dstX, stuff->dstY, + shmdesc->addr + stuff->offset); if (stuff->sendEvent) { diff --git a/Xext/shmint.h b/Xext/shmint.h index 33ab6a428..fc056bc72 100644 --- a/Xext/shmint.h +++ b/Xext/shmint.h @@ -36,9 +36,6 @@ ShmRegisterFuncs(ScreenPtr pScreen, ShmFuncsPtr funcs); void ShmSetPixmapFormat(ScreenPtr pScreen, int format); -void -fbShmPutImage(XSHM_PUT_IMAGE_ARGS); - void ShmRegisterFbFuncs(ScreenPtr pScreen); diff --git a/exa/exa.c b/exa/exa.c index 100a1ec66..ccf148a3e 100644 --- a/exa/exa.c +++ b/exa/exa.c @@ -924,13 +924,6 @@ exaDriverInit (ScreenPtr pScreen, } #endif -#ifdef MITSHM - /* Re-register with the MI funcs, which don't allow shared pixmaps. - * Shared pixmaps are almost always a performance loss for us, but this - * still allows for SHM PutImage. - */ - ShmRegisterFuncs(pScreen, &exaShmFuncs); -#endif /* * Hookup offscreen pixmaps */ diff --git a/exa/exa_accel.c b/exa/exa_accel.c index d66dd4718..3ec96253d 100644 --- a/exa/exa_accel.c +++ b/exa/exa_accel.c @@ -245,104 +245,12 @@ exaDoPutImage (DrawablePtr pDrawable, GCPtr pGC, int depth, int x, int y, return TRUE; } -#ifdef MITSHM - -static Bool -exaDoShmPutImage(DrawablePtr pDrawable, GCPtr pGC, int depth, - unsigned int format, int w, int h, int sx, int sy, int sw, - int sh, int dx, int dy, char *data) -{ - int src_stride = PixmapBytePad(w, depth); - - if (exaDoPutImage(pDrawable, pGC, depth, dx, dy, sw, sh, format, data + - sy * src_stride + sx * BitsPerPixel(depth) / 8, - src_stride)) - return TRUE; - - if (format == ZPixmap) - { - PixmapPtr pPixmap; - - pPixmap = GetScratchPixmapHeader(pDrawable->pScreen, w, h, depth, - BitsPerPixel(depth), PixmapBytePad(w, depth), (pointer)data); - if (!pPixmap) - return FALSE; - - if (exaGCReadsDestination(pDrawable, pGC->planemask, pGC->fillStyle, - pGC->alu)) - exaPrepareAccess (pDrawable, EXA_PREPARE_DEST); - else - ExaDoPrepareAccess (pDrawable, EXA_PREPARE_DEST); - fbCopyArea((DrawablePtr)pPixmap, pDrawable, pGC, sx, sy, sw, sh, dx, dy); - exaFinishAccess(pDrawable, EXA_PREPARE_DEST); - - FreeScratchPixmapHeader(pPixmap); - - return TRUE; - } - - return FALSE; -} - -/* The actual ShmPutImage isn't wrapped by the damage layer, so we need to - * inform any interested parties of the damage incurred to the drawable. - * - * We also need to set the pending damage to ensure correct migration in all - * cases. - */ -void -exaShmPutImage(DrawablePtr pDrawable, GCPtr pGC, int depth, unsigned int format, - int w, int h, int sx, int sy, int sw, int sh, int dx, int dy, - char *data) -{ - PixmapPtr pPixmap = exaGetDrawablePixmap(pDrawable); - ExaPixmapPriv(pPixmap); - BoxRec box = { .x1 = pDrawable->x + dx, .y1 = pDrawable->y + dy, - .x2 = pDrawable->x + dx + sw, .y2 = pDrawable->y + dy + sh }; - RegionRec region; - int xoff, yoff; - RegionPtr pending_damage = DamagePendingRegion(pExaPixmap->pDamage); - - REGION_INIT(pScreen, ®ion, &box, 1); - - exaGetDrawableDeltas(pDrawable, pPixmap, &xoff, &yoff); - - REGION_TRANSLATE(pScreen, ®ion, xoff, yoff); - REGION_UNION(pScreen, pending_damage, pending_damage, ®ion); - - if (!exaDoShmPutImage(pDrawable, pGC, depth, format, w, h, sx, sy, sw, sh, - dx, dy, data)) { - if (exaGCReadsDestination(pDrawable, pGC->planemask, pGC->fillStyle, - pGC->alu)) - exaPrepareAccess (pDrawable, EXA_PREPARE_DEST); - else - ExaDoPrepareAccess (pDrawable, EXA_PREPARE_DEST); - fbShmPutImage(pDrawable, pGC, depth, format, w, h, sx, sy, sw, sh, dx, dy, - data); - exaFinishAccess(pDrawable, EXA_PREPARE_DEST); - } - - REGION_TRANSLATE(pScreen, ®ion, -xoff, -yoff); - DamageDamageRegion(pDrawable, ®ion); - - REGION_UNINIT(pScreen, ®ion); -} - -ShmFuncs exaShmFuncs = { NULL, exaShmPutImage }; - -#endif - static void exaPutImage (DrawablePtr pDrawable, GCPtr pGC, int depth, int x, int y, int w, int h, int leftPad, int format, char *bits) { -#ifdef MITSHM - if (!exaDoShmPutImage(pDrawable, pGC, depth, format, w, h, 0, 0, w, h, x, y, - bits)) -#else if (!exaDoPutImage(pDrawable, pGC, depth, x, y, w, h, format, bits, PixmapBytePad(w, pDrawable->depth))) -#endif ExaCheckPutImage(pDrawable, pGC, depth, x, y, w, h, leftPad, format, bits); } diff --git a/exa/exa_priv.h b/exa/exa_priv.h index 21e6f0b55..e4b6b54a5 100644 --- a/exa/exa_priv.h +++ b/exa/exa_priv.h @@ -319,21 +319,12 @@ Bool exaFillRegionTiled (DrawablePtr pDrawable, RegionPtr pRegion, PixmapPtr pTile, DDXPointPtr pPatOrg, CARD32 planemask, CARD32 alu); -void -exaShmPutImage(DrawablePtr pDrawable, GCPtr pGC, int depth, unsigned int format, - int w, int h, int sx, int sy, int sw, int sh, int dx, int dy, - char *data); - void exaGetImage (DrawablePtr pDrawable, int x, int y, int w, int h, unsigned int format, unsigned long planeMask, char *d); extern const GCOps exaOps; -#ifdef MITSHM -extern ShmFuncs exaShmFuncs; -#endif - #ifdef RENDER void ExaCheckComposite (CARD8 op, From 05472534cfefe6057b908cc7d698967eecb5dde4 Mon Sep 17 00:00:00 2001 From: Daniel Drake Date: Thu, 24 Jul 2008 21:06:34 -0500 Subject: [PATCH 3/5] Don't abort if swrast library is not present GLX is enabled by default, but the current swrast behaviour causes X to abort with fatal error if the swrast dri library dlopen fails. Handle the case where the swrast library is not present, and do not register the GLX extension unless at least one screen has a usable GL provider. (cherry picked from commit eff25430b4a391409e39337962ff7697165d23c7) --- glx/glxdriswrast.c | 2 +- glx/glxext.c | 37 ++++++++++++++++++++++++------------- 2 files changed, 25 insertions(+), 14 deletions(-) diff --git a/glx/glxdriswrast.c b/glx/glxdriswrast.c index 9d987c238..f36dae739 100644 --- a/glx/glxdriswrast.c +++ b/glx/glxdriswrast.c @@ -532,7 +532,7 @@ __glXDRIscreenProbe(ScreenPtr pScreen) xfree(screen); - FatalError("GLX: could not load software renderer\n"); + LogMessage(X_ERROR, "GLX: could not load software renderer\n"); return NULL; } diff --git a/glx/glxext.c b/glx/glxext.c index 13c65dade..6ba404fb1 100644 --- a/glx/glxext.c +++ b/glx/glxext.c @@ -279,6 +279,7 @@ void GlxExtensionInit(void) ScreenPtr pScreen; int i; __GLXprovider *p; + Bool glx_provided = False; __glXContextRes = CreateNewResourceType((DeleteType)ContextGone); __glXDrawableRes = CreateNewResourceType((DeleteType)DrawableGone); @@ -289,6 +290,29 @@ void GlxExtensionInit(void) if (!AddCallback (&ClientStateCallback, glxClientCallback, 0)) return; + for (i = 0; i < screenInfo.numScreens; i++) { + pScreen = screenInfo.screens[i]; + + for (p = __glXProviderStack; p != NULL; p = p->next) { + if (p->screenProbe(pScreen) != NULL) { + LogMessage(X_INFO, + "GLX: Initialized %s GL provider for screen %d\n", + p->name, i); + break; + } + } + + if (!p) + LogMessage(X_INFO, + "GLX: no usable GL providers found for screen %d\n", i); + else + glx_provided = True; + } + + /* don't register extension if GL is not provided on any screen */ + if (!glx_provided) + return; + /* ** Add extension to server extensions. */ @@ -306,19 +330,6 @@ void GlxExtensionInit(void) } __glXErrorBase = extEntry->errorBase; - - for (i = 0; i < screenInfo.numScreens; i++) { - pScreen = screenInfo.screens[i]; - - for (p = __glXProviderStack; p != NULL; p = p->next) { - if (p->screenProbe(pScreen) != NULL) { - LogMessage(X_INFO, - "GLX: Initialized %s GL provider for screen %d\n", - p->name, i); - break; - } - } - } } /************************************************************************/ From d0ef93430505d110e0d3c0552dad3361db33b369 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fredrik=20H=C3=B6glund?= Date: Mon, 18 Aug 2008 19:27:34 +0200 Subject: [PATCH 4/5] Fix the tile offset in miPaintWindow for ParentRelative windows. (cherry picked from commit 244a635fcdc9e0a7212d51b26d74f49d8e1b071f) --- mi/miexpose.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/mi/miexpose.c b/mi/miexpose.c index 5c2bd0382..2fba6a28c 100644 --- a/mi/miexpose.c +++ b/mi/miexpose.c @@ -564,8 +564,8 @@ miPaintWindow(WindowPtr pWin, RegionPtr prgn, int what) draw_x_off = drawable->x; draw_y_off = drawable->y; - tile_x_off = 0; - tile_y_off = 0; + tile_x_off = pWin->drawable.x - draw_x_off; + tile_y_off = pWin->drawable.y - draw_y_off; fill = pWin->background; switch (pWin->backgroundState) { case None: From 580e96d6d4355acae6314105a3a8e4c7a4d6e3ea Mon Sep 17 00:00:00 2001 From: Xavier Bestel Date: Tue, 29 Jul 2008 13:06:10 -0400 Subject: [PATCH 5/5] Cosmetic fix to EDID decoding. (cherry picked from commit bb2cacd33eb85f39b9e7fa554545611957df677d) --- hw/xfree86/ddc/print_edid.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/hw/xfree86/ddc/print_edid.c b/hw/xfree86/ddc/print_edid.c index f5442adb7..df11bfb3d 100644 --- a/hw/xfree86/ddc/print_edid.c +++ b/hw/xfree86/ddc/print_edid.c @@ -148,7 +148,8 @@ print_dpms_features(int scrnIndex, struct disp_features *c, } } else { int enc = c->display_type; - xf86DrvMsg(scrnIndex, X_INFO, "\nSupported color encodings: " + xf86ErrorF("\n"); + xf86DrvMsg(scrnIndex, X_INFO, "Supported color encodings: " "RGB 4:4:4 %s%s\n", enc & DISP_YCRCB444 ? "YCrCb 4:4:4 " : "", enc & DISP_YCRCB422 ? "YCrCb 4:2:2" : "");