From 6ff81ff439b9ac3f9716841eeaf64b2bd44f1111 Mon Sep 17 00:00:00 2001 From: "Enrico Weigelt, metux IT consult" Date: Mon, 11 Aug 2025 09:53:01 +0200 Subject: [PATCH] hack1 --- Xext/vidmode.c | 94 +++++------ dix/screenint_priv.h | 8 + glx/vnd_dispatch_stubs.c | 314 ++++++++++++------------------------ hw/xfree86/common/xf86DGA.c | 69 +++++--- 4 files changed, 198 insertions(+), 287 deletions(-) diff --git a/Xext/vidmode.c b/Xext/vidmode.c index 7e061ecc78..dd2a0ac2a5 100644 --- a/Xext/vidmode.c +++ b/Xext/vidmode.c @@ -39,6 +39,7 @@ from Kaleb S. KEITHLEY #include "dix/dix_priv.h" #include "dix/rpcbuf_priv.h" +#include "dix/screenint_priv.h" #include "os/log_priv.h" #include "os/osdep.h" @@ -216,7 +217,6 @@ static int ProcVidModeGetModeLine(ClientPtr client) { REQUEST(xXF86VidModeGetModeLineReq); - ScreenPtr pScreen; VidModePtr pVidMode; DisplayModePtr mode; int dotClock; @@ -227,9 +227,10 @@ ProcVidModeGetModeLine(ClientPtr client) ver = ClientMajorVersion(client); REQUEST_SIZE_MATCH(xXF86VidModeGetModeLineReq); - if (stuff->screen >= screenInfo.numScreens) + ScreenPtr pScreen = GetScreenPtr(stuff->screen); + if (!pScreen) return BadValue; - pScreen = screenInfo.screens[stuff->screen]; + pVidMode = VidModeGetPtr(pScreen); if (pVidMode == NULL) return BadImplementation; @@ -341,7 +342,6 @@ static int ProcVidModeGetAllModeLines(ClientPtr client) { REQUEST(xXF86VidModeGetAllModeLinesReq); - ScreenPtr pScreen; VidModePtr pVidMode; DisplayModePtr mode; int modecount, dotClock; @@ -351,9 +351,10 @@ ProcVidModeGetAllModeLines(ClientPtr client) REQUEST_SIZE_MATCH(xXF86VidModeGetAllModeLinesReq); - if (stuff->screen >= screenInfo.numScreens) + ScreenPtr pScreen = GetScreenPtr(stuff->screen); + if (!pScreen) return BadValue; - pScreen = screenInfo.screens[stuff->screen]; + ver = ClientMajorVersion(client); pVidMode = VidModeGetPtr(pScreen); if (pVidMode == NULL) @@ -466,7 +467,6 @@ ProcVidModeAddModeLine(ClientPtr client) static int VidModeAddModeLine(ClientPtr client, xXF86VidModeAddModeLineReq* stuff) { - ScreenPtr pScreen; DisplayModePtr mode; VidModePtr pVidMode; int dotClock; @@ -489,9 +489,9 @@ static int VidModeAddModeLine(ClientPtr client, xXF86VidModeAddModeLineReq* stuf stuff->after_vsyncend, stuff->after_vtotal, (unsigned long) stuff->after_flags); - if (stuff->screen >= screenInfo.numScreens) + ScreenPtr pScreen = GetScreenPtr(stuff->screen); + if (!pScreen) return BadValue; - pScreen = screenInfo.screens[stuff->screen]; if (stuff->hsyncstart < stuff->hdisplay || stuff->hsyncend < stuff->hsyncstart || @@ -651,7 +651,6 @@ VidModeDeleteModeLine(ClientPtr client, xXF86VidModeDeleteModeLineReq* stuff) int dotClock; DisplayModePtr mode; VidModePtr pVidMode; - ScreenPtr pScreen; DebugF("DeleteModeLine - scrn: %d clock: %ld\n", (int) stuff->screen, (unsigned long) stuff->dotclock); @@ -662,9 +661,9 @@ VidModeDeleteModeLine(ClientPtr client, xXF86VidModeDeleteModeLineReq* stuff) stuff->vdisplay, stuff->vsyncstart, stuff->vsyncend, stuff->vtotal, (unsigned long) stuff->flags); - if (stuff->screen >= screenInfo.numScreens) + ScreenPtr pScreen = GetScreenPtr(stuff->screen); + if (!pScreen) return BadValue; - pScreen = screenInfo.screens[stuff->screen]; pVidMode = VidModeGetPtr(pScreen); if (pVidMode == NULL) @@ -774,7 +773,6 @@ ProcVidModeModModeLine(ClientPtr client) static int VidModeModModeLine(ClientPtr client, xXF86VidModeModModeLineReq *stuff) { - ScreenPtr pScreen; VidModePtr pVidMode; DisplayModePtr mode; int dotClock; @@ -793,9 +791,9 @@ VidModeModModeLine(ClientPtr client, xXF86VidModeModModeLineReq *stuff) stuff->vsyncend < stuff->vsyncstart || stuff->vtotal < stuff->vsyncend) return BadValue; - if (stuff->screen >= screenInfo.numScreens) + ScreenPtr pScreen = GetScreenPtr(stuff->screen); + if (!pScreen) return BadValue; - pScreen = screenInfo.screens[stuff->screen]; pVidMode = VidModeGetPtr(pScreen); if (pVidMode == NULL) @@ -917,7 +915,6 @@ ProcVidModeValidateModeLine(ClientPtr client) static int VidModeValidateModeLine(ClientPtr client, xXF86VidModeValidateModeLineReq *stuff) { - ScreenPtr pScreen; VidModePtr pVidMode; DisplayModePtr mode, modetmp = NULL; int status, dotClock; @@ -931,9 +928,9 @@ VidModeValidateModeLine(ClientPtr client, xXF86VidModeValidateModeLineReq *stuff stuff->vdisplay, stuff->vsyncstart, stuff->vsyncend, stuff->vtotal, (unsigned long) stuff->flags); - if (stuff->screen >= screenInfo.numScreens) + ScreenPtr pScreen = GetScreenPtr(stuff->screen); + if (!pScreen) return BadValue; - pScreen = screenInfo.screens[stuff->screen]; status = MODE_OK; @@ -1000,7 +997,6 @@ static int ProcVidModeSwitchMode(ClientPtr client) { REQUEST(xXF86VidModeSwitchModeReq); - ScreenPtr pScreen; VidModePtr pVidMode; DEBUG_P("XF86VidModeSwitchMode"); @@ -1011,9 +1007,9 @@ ProcVidModeSwitchMode(ClientPtr client) if (!VidModeAllowNonLocal && !client->local) return VidModeErrorBase + XF86VidModeClientNotLocal; - if (stuff->screen >= screenInfo.numScreens) + ScreenPtr pScreen = GetScreenPtr(stuff->screen); + if (!pScreen) return BadValue; - pScreen = screenInfo.screens[stuff->screen]; pVidMode = VidModeGetPtr(pScreen); if (pVidMode == NULL) @@ -1080,7 +1076,6 @@ ProcVidModeSwitchToMode(ClientPtr client) static int VidModeSwitchToMode(ClientPtr client, xXF86VidModeSwitchToModeReq *stuff) { - ScreenPtr pScreen; VidModePtr pVidMode; DisplayModePtr mode; int dotClock; @@ -1094,9 +1089,9 @@ VidModeSwitchToMode(ClientPtr client, xXF86VidModeSwitchToModeReq *stuff) stuff->vdisplay, stuff->vsyncstart, stuff->vsyncend, stuff->vtotal, (unsigned long) stuff->flags); - if (stuff->screen >= screenInfo.numScreens) + ScreenPtr pScreen = GetScreenPtr(stuff->screen); + if (!pScreen) return BadValue; - pScreen = screenInfo.screens[stuff->screen]; pVidMode = VidModeGetPtr(pScreen); if (pVidMode == NULL) @@ -1145,7 +1140,6 @@ static int ProcVidModeLockModeSwitch(ClientPtr client) { REQUEST(xXF86VidModeLockModeSwitchReq); - ScreenPtr pScreen; VidModePtr pVidMode; REQUEST_SIZE_MATCH(xXF86VidModeLockModeSwitchReq); @@ -1156,9 +1150,9 @@ ProcVidModeLockModeSwitch(ClientPtr client) if (!VidModeAllowNonLocal && !client->local) return VidModeErrorBase + XF86VidModeClientNotLocal; - if (stuff->screen >= screenInfo.numScreens) + ScreenPtr pScreen = GetScreenPtr(stuff->screen); + if (!pScreen) return BadValue; - pScreen = screenInfo.screens[stuff->screen]; pVidMode = VidModeGetPtr(pScreen); if (pVidMode == NULL) @@ -1187,9 +1181,9 @@ ProcVidModeGetMonitor(ClientPtr client) REQUEST_SIZE_MATCH(xXF86VidModeGetMonitorReq); - if (stuff->screen >= screenInfo.numScreens) + ScreenPtr pScreen = GetScreenPtr(stuff->screen); + if (!pScreen) return BadValue; - ScreenPtr pScreen = screenInfo.screens[stuff->screen]; VidModePtr pVidMode = VidModeGetPtr(pScreen); if (pVidMode == NULL) @@ -1238,7 +1232,6 @@ static int ProcVidModeGetViewPort(ClientPtr client) { REQUEST(xXF86VidModeGetViewPortReq); - ScreenPtr pScreen; VidModePtr pVidMode; int x, y; @@ -1246,9 +1239,9 @@ ProcVidModeGetViewPort(ClientPtr client) REQUEST_SIZE_MATCH(xXF86VidModeGetViewPortReq); - if (stuff->screen >= screenInfo.numScreens) + ScreenPtr pScreen = GetScreenPtr(stuff->screen); + if (!pScreen) return BadValue; - pScreen = screenInfo.screens[stuff->screen]; pVidMode = VidModeGetPtr(pScreen); if (pVidMode == NULL) @@ -1273,7 +1266,6 @@ static int ProcVidModeSetViewPort(ClientPtr client) { REQUEST(xXF86VidModeSetViewPortReq); - ScreenPtr pScreen; VidModePtr pVidMode; DEBUG_P("XF86VidModeSetViewPort"); @@ -1284,9 +1276,9 @@ ProcVidModeSetViewPort(ClientPtr client) if (!VidModeAllowNonLocal && !client->local) return VidModeErrorBase + XF86VidModeClientNotLocal; - if (stuff->screen >= screenInfo.numScreens) + ScreenPtr pScreen = GetScreenPtr(stuff->screen); + if (!pScreen) return BadValue; - pScreen = screenInfo.screens[stuff->screen]; pVidMode = VidModeGetPtr(pScreen); if (pVidMode == NULL) @@ -1302,7 +1294,6 @@ static int ProcVidModeGetDotClocks(ClientPtr client) { REQUEST(xXF86VidModeGetDotClocksReq); - ScreenPtr pScreen; VidModePtr pVidMode; int numClocks; Bool ClockProg; @@ -1311,9 +1302,9 @@ ProcVidModeGetDotClocks(ClientPtr client) REQUEST_SIZE_MATCH(xXF86VidModeGetDotClocksReq); - if (stuff->screen >= screenInfo.numScreens) + ScreenPtr pScreen = GetScreenPtr(stuff->screen); + if (!pScreen) return BadValue; - pScreen = screenInfo.screens[stuff->screen]; pVidMode = VidModeGetPtr(pScreen); if (pVidMode == NULL) @@ -1361,7 +1352,6 @@ static int ProcVidModeSetGamma(ClientPtr client) { REQUEST(xXF86VidModeSetGammaReq); - ScreenPtr pScreen; VidModePtr pVidMode; DEBUG_P("XF86VidModeSetGamma"); @@ -1372,9 +1362,9 @@ ProcVidModeSetGamma(ClientPtr client) if (!VidModeAllowNonLocal && !client->local) return VidModeErrorBase + XF86VidModeClientNotLocal; - if (stuff->screen >= screenInfo.numScreens) + ScreenPtr pScreen = GetScreenPtr(stuff->screen); + if (!pScreen) return BadValue; - pScreen = screenInfo.screens[stuff->screen]; pVidMode = VidModeGetPtr(pScreen); if (pVidMode == NULL) @@ -1392,7 +1382,6 @@ static int ProcVidModeGetGamma(ClientPtr client) { REQUEST(xXF86VidModeGetGammaReq); - ScreenPtr pScreen; VidModePtr pVidMode; float red, green, blue; @@ -1400,9 +1389,9 @@ ProcVidModeGetGamma(ClientPtr client) REQUEST_SIZE_MATCH(xXF86VidModeGetGammaReq); - if (stuff->screen >= screenInfo.numScreens) + ScreenPtr pScreen = GetScreenPtr(stuff->screen); + if (!pScreen) return BadValue; - pScreen = screenInfo.screens[stuff->screen]; pVidMode = VidModeGetPtr(pScreen); if (pVidMode == NULL) @@ -1430,7 +1419,6 @@ ProcVidModeSetGammaRamp(ClientPtr client) { CARD16 *r, *g, *b; int length; - ScreenPtr pScreen; VidModePtr pVidMode; /* limited to local-only connections */ @@ -1440,9 +1428,9 @@ ProcVidModeSetGammaRamp(ClientPtr client) REQUEST(xXF86VidModeSetGammaRampReq); REQUEST_AT_LEAST_SIZE(xXF86VidModeSetGammaRampReq); - if (stuff->screen >= screenInfo.numScreens) + ScreenPtr pScreen = GetScreenPtr(stuff->screen); + if (!pScreen) return BadValue; - pScreen = screenInfo.screens[stuff->screen]; pVidMode = VidModeGetPtr(pScreen); if (pVidMode == NULL) @@ -1471,9 +1459,9 @@ ProcVidModeGetGammaRamp(ClientPtr client) REQUEST(xXF86VidModeGetGammaRampReq); REQUEST_SIZE_MATCH(xXF86VidModeGetGammaRampReq); - if (stuff->screen >= screenInfo.numScreens) + ScreenPtr pScreen = GetScreenPtr(stuff->screen); + if (!pScreen) return BadValue; - ScreenPtr pScreen = screenInfo.screens[stuff->screen]; VidModePtr pVidMode = VidModeGetPtr(pScreen); if (pVidMode == NULL) @@ -1517,16 +1505,15 @@ ProcVidModeGetGammaRamp(ClientPtr client) static int ProcVidModeGetGammaRampSize(ClientPtr client) { - ScreenPtr pScreen; VidModePtr pVidMode; REQUEST(xXF86VidModeGetGammaRampSizeReq); REQUEST_SIZE_MATCH(xXF86VidModeGetGammaRampSizeReq); - if (stuff->screen >= screenInfo.numScreens) + ScreenPtr pScreen = GetScreenPtr(stuff->screen); + if (!pScreen) return BadValue; - pScreen = screenInfo.screens[stuff->screen]; pVidMode = VidModeGetPtr(pScreen); if (pVidMode == NULL) @@ -1548,7 +1535,8 @@ ProcVidModeGetPermissions(ClientPtr client) REQUEST(xXF86VidModeGetPermissionsReq); REQUEST_SIZE_MATCH(xXF86VidModeGetPermissionsReq); - if (stuff->screen >= screenInfo.numScreens) + ScreenPtr pScreen = GetScreenPtr(stuff->screen); + if (!pScreen) return BadValue; xXF86VidModeGetPermissionsReply rep = { diff --git a/dix/screenint_priv.h b/dix/screenint_priv.h index 616cfbfb67..19474d8d62 100644 --- a/dix/screenint_priv.h +++ b/dix/screenint_priv.h @@ -9,6 +9,7 @@ #include #include "screenint.h" +#include "include/scrnintstr.h" typedef Bool (*ScreenInitProcPtr)(ScreenPtr pScreen, int argc, char **argv); @@ -23,4 +24,11 @@ void DetachUnboundGPU(ScreenPtr unbound); void AttachOffloadGPU(ScreenPtr pScreen, ScreenPtr newScreen); void DetachOffloadGPU(ScreenPtr slave); +static inline ScreenPtr GetScreenPtr(unsigned int id) +{ + if (id < screenInfo.numScreens) + return screenInfo.screens[id]; + return NULL; +} + #endif /* _XSERVER_DIX_SCREENINT_PRIV_H */ diff --git a/glx/vnd_dispatch_stubs.c b/glx/vnd_dispatch_stubs.c index 6de071ee0b..5d78c2f285 100644 --- a/glx/vnd_dispatch_stubs.c +++ b/glx/vnd_dispatch_stubs.c @@ -2,6 +2,7 @@ #include #include "dix/dix_priv.h" +#include "dix/screenint_priv.h" #include #include "vndserver.h" @@ -11,6 +12,69 @@ #define X_GLXCreateContextAttribsARB X_GLXCreateContextAtrribsARB #endif +static GlxServerVendor *vendorForScreen( + ClientPtr pClient, + CARD32 raw_screen) +{ + CARD32 screenId = GlxCheckSwap(pClient, raw_screen); + ScreenPtr pScreen = GetScreenPtr(screenId); + if (!pScreen) { + pClient->errorValue = screenId; + return NULL; + } + + return glxServer.getVendorForScreen(pClient, pScreen); +} + +static GlxServerVendor *vendorForTag( + ClientPtr pClient, + CARD32 raw_context) +{ + CARD32 contextTag = GlxCheckSwap(client, raw_context); + GlxServerVendor *vendor = glxServer.getContextTag(client, contextTag); + if (!vendor) { + client->errorValue = contextTag; + return NULL; + } + + return vendor; +} + +static int forward_simple(ClientPtr pClient, CARD32 raw_screen) +{ + GlxServerVendor *vendor = vendorForScreen(pClient, raw_screen); + if (!vendor) + return BadMatch; + + return glxServer.forwardRequest(vendor, pClient); +} + +static int forward_xidmap(ClientPtr pClient, CARD32 raw_screen, XID xid) +{ + GlxServerVendor *vendor = vendorForScreen(pClient, raw_screen); + if (!vendor) + return BadMatch; + + if (!glxServer.addXIDMap(xid, vendor)) { + return BadAlloc; + } + + int ret = glxServer.forwardRequest(vendor, pClient); + if (ret != Success) { + glxServer.removeXIDMap(xid); + } + + return ret; +} + +static int forward_create(ClientPtr pClient, CARD32 raw_screen, XID raw_xid) +{ + XID xid = GlxCheckSwap(pClient, raw_xid); + LEGAL_NEW_RESOURCE(xid, pClient); + + return forward_xidmap(pClient, raw_screen, xid); +} + static int dispatch_Render(ClientPtr client) { REQUEST(xGLXRenderReq); @@ -18,7 +82,8 @@ static int dispatch_Render(ClientPtr client) GlxServerVendor *vendor = NULL; REQUEST_AT_LEAST_SIZE(*stuff); contextTag = GlxCheckSwap(client, stuff->contextTag); - vendor = glxServer.getContextTag(client, contextTag); + + GlxServerVendor *vendor = glxServer.getContextTag(client, stuff->contextTag); if (vendor != NULL) { int ret; ret = glxServer.forwardRequest(vendor, client); @@ -28,6 +93,7 @@ static int dispatch_Render(ClientPtr client) return GlxErrorBase + GLXBadContextTag; } } + static int dispatch_RenderLarge(ClientPtr client) { REQUEST(xGLXRenderLargeReq); @@ -45,33 +111,15 @@ static int dispatch_RenderLarge(ClientPtr client) return GlxErrorBase + GLXBadContextTag; } } + static int dispatch_CreateContext(ClientPtr client) { REQUEST(xGLXCreateContextReq); - CARD32 screen, context; - GlxServerVendor *vendor = NULL; REQUEST_SIZE_MATCH(*stuff); - screen = GlxCheckSwap(client, stuff->screen); - context = GlxCheckSwap(client, stuff->context); - LEGAL_NEW_RESOURCE(context, client); - if (screen < screenInfo.numScreens) { - vendor = glxServer.getVendorForScreen(client, screenInfo.screens[screen]); - } - if (vendor != NULL) { - int ret; - if (!glxServer.addXIDMap(context, vendor)) { - return BadAlloc; - } - ret = glxServer.forwardRequest(vendor, client); - if (ret != Success) { - glxServer.removeXIDMap(context); - } - return ret; - } else { - client->errorValue = screen; - return BadMatch; - } + + return forward_create(client, stuff->screen, stuff->context); } + static int dispatch_DestroyContext(ClientPtr client) { REQUEST(xGLXDestroyContextReq); @@ -80,6 +128,7 @@ static int dispatch_DestroyContext(ClientPtr client) REQUEST_SIZE_MATCH(*stuff); context = GlxCheckSwap(client, stuff->context); vendor = glxServer.getXIDMap(context); + if (vendor != NULL) { int ret; ret = glxServer.forwardRequest(vendor, client); @@ -146,49 +195,19 @@ static int dispatch_UseXFont(ClientPtr client) static int dispatch_CreateGLXPixmap(ClientPtr client) { REQUEST(xGLXCreateGLXPixmapReq); - CARD32 screen, glxpixmap; - GlxServerVendor *vendor = NULL; REQUEST_SIZE_MATCH(*stuff); - screen = GlxCheckSwap(client, stuff->screen); - glxpixmap = GlxCheckSwap(client, stuff->glxpixmap); - LEGAL_NEW_RESOURCE(glxpixmap, client); - if (screen < screenInfo.numScreens) { - vendor = glxServer.getVendorForScreen(client, screenInfo.screens[screen]); - } - if (vendor != NULL) { - int ret; - if (!glxServer.addXIDMap(glxpixmap, vendor)) { - return BadAlloc; - } - ret = glxServer.forwardRequest(vendor, client); - if (ret != Success) { - glxServer.removeXIDMap(glxpixmap); - } - return ret; - } else { - client->errorValue = screen; - return BadMatch; - } + + return forward_xidmap(client, stuff->screen, stuff->glxpixmap); } + static int dispatch_GetVisualConfigs(ClientPtr client) { REQUEST(xGLXGetVisualConfigsReq); - CARD32 screen; - GlxServerVendor *vendor = NULL; REQUEST_SIZE_MATCH(*stuff); - screen = GlxCheckSwap(client, stuff->screen); - if (screen < screenInfo.numScreens) { - vendor = glxServer.getVendorForScreen(client, screenInfo.screens[screen]); - } - if (vendor != NULL) { - int ret; - ret = glxServer.forwardRequest(vendor, client); - return ret; - } else { - client->errorValue = screen; - return BadMatch; - } + + return forward_simple(client, stuff->screen); } + static int dispatch_DestroyGLXPixmap(ClientPtr client) { REQUEST(xGLXDestroyGLXPixmapReq); @@ -206,44 +225,23 @@ static int dispatch_DestroyGLXPixmap(ClientPtr client) return GlxErrorBase + GLXBadPixmap; } } + static int dispatch_QueryExtensionsString(ClientPtr client) { REQUEST(xGLXQueryExtensionsStringReq); - CARD32 screen; - GlxServerVendor *vendor = NULL; REQUEST_SIZE_MATCH(*stuff); - screen = GlxCheckSwap(client, stuff->screen); - if (screen < screenInfo.numScreens) { - vendor = glxServer.getVendorForScreen(client, screenInfo.screens[screen]); - } - if (vendor != NULL) { - int ret; - ret = glxServer.forwardRequest(vendor, client); - return ret; - } else { - client->errorValue = screen; - return BadMatch; - } + + return forward_simple(client, stuff->screen); } + static int dispatch_QueryServerString(ClientPtr client) { REQUEST(xGLXQueryServerStringReq); - CARD32 screen; - GlxServerVendor *vendor = NULL; REQUEST_SIZE_MATCH(*stuff); - screen = GlxCheckSwap(client, stuff->screen); - if (screen < screenInfo.numScreens) { - vendor = glxServer.getVendorForScreen(client, screenInfo.screens[screen]); - } - if (vendor != NULL) { - int ret; - ret = glxServer.forwardRequest(vendor, client); - return ret; - } else { - client->errorValue = screen; - return BadMatch; - } + + return forward_simple(client, stuff->screen); } + static int dispatch_ChangeDrawableAttributes(ClientPtr client) { REQUEST(xGLXChangeDrawableAttributesReq); @@ -264,138 +262,43 @@ static int dispatch_ChangeDrawableAttributes(ClientPtr client) static int dispatch_CreateNewContext(ClientPtr client) { REQUEST(xGLXCreateNewContextReq); - CARD32 screen, context; - GlxServerVendor *vendor = NULL; REQUEST_SIZE_MATCH(*stuff); - screen = GlxCheckSwap(client, stuff->screen); - context = GlxCheckSwap(client, stuff->context); - LEGAL_NEW_RESOURCE(context, client); - if (screen < screenInfo.numScreens) { - vendor = glxServer.getVendorForScreen(client, screenInfo.screens[screen]); - } - if (vendor != NULL) { - int ret; - if (!glxServer.addXIDMap(context, vendor)) { - return BadAlloc; - } - ret = glxServer.forwardRequest(vendor, client); - if (ret != Success) { - glxServer.removeXIDMap(context); - } - return ret; - } else { - client->errorValue = screen; - return BadMatch; - } + + return forward_xidmap(client, stuff->screen, stuff->context); } + static int dispatch_CreatePbuffer(ClientPtr client) { REQUEST(xGLXCreatePbufferReq); - CARD32 screen, pbuffer; - GlxServerVendor *vendor = NULL; REQUEST_AT_LEAST_SIZE(*stuff); - screen = GlxCheckSwap(client, stuff->screen); - pbuffer = GlxCheckSwap(client, stuff->pbuffer); - LEGAL_NEW_RESOURCE(pbuffer, client); - if (screen < screenInfo.numScreens) { - vendor = glxServer.getVendorForScreen(client, screenInfo.screens[screen]); - } - if (vendor != NULL) { - int ret; - if (!glxServer.addXIDMap(pbuffer, vendor)) { - return BadAlloc; - } - ret = glxServer.forwardRequest(vendor, client); - if (ret != Success) { - glxServer.removeXIDMap(pbuffer); - } - return ret; - } else { - client->errorValue = screen; - return BadMatch; - } + + return forward_xidmap(client, stuff->screen, stuff->pbuffer); } + static int dispatch_CreatePixmap(ClientPtr client) { REQUEST(xGLXCreatePixmapReq); - CARD32 screen, glxpixmap; - GlxServerVendor *vendor = NULL; REQUEST_AT_LEAST_SIZE(*stuff); - screen = GlxCheckSwap(client, stuff->screen); - glxpixmap = GlxCheckSwap(client, stuff->glxpixmap); - LEGAL_NEW_RESOURCE(glxpixmap, client); - if (screen < screenInfo.numScreens) { - vendor = glxServer.getVendorForScreen(client, screenInfo.screens[screen]); - } - if (vendor != NULL) { - int ret; - if (!glxServer.addXIDMap(glxpixmap, vendor)) { - return BadAlloc; - } - ret = glxServer.forwardRequest(vendor, client); - if (ret != Success) { - glxServer.removeXIDMap(glxpixmap); - } - return ret; - } else { - client->errorValue = screen; - return BadMatch; - } + + return forward_xidmap(client, stuff->screen, stuff->glxpixmap); } + static int dispatch_CreateWindow(ClientPtr client) { REQUEST(xGLXCreateWindowReq); - CARD32 screen, glxwindow; - GlxServerVendor *vendor = NULL; REQUEST_AT_LEAST_SIZE(*stuff); - screen = GlxCheckSwap(client, stuff->screen); - glxwindow = GlxCheckSwap(client, stuff->glxwindow); - LEGAL_NEW_RESOURCE(glxwindow, client); - if (screen < screenInfo.numScreens) { - vendor = glxServer.getVendorForScreen(client, screenInfo.screens[screen]); - } - if (vendor != NULL) { - int ret; - if (!glxServer.addXIDMap(glxwindow, vendor)) { - return BadAlloc; - } - ret = glxServer.forwardRequest(vendor, client); - if (ret != Success) { - glxServer.removeXIDMap(glxwindow); - } - return ret; - } else { - client->errorValue = screen; - return BadMatch; - } + + return forward_xidmap(client, stuff->screen, stuff->glxwindow); } + static int dispatch_CreateContextAttribsARB(ClientPtr client) { REQUEST(xGLXCreateContextAttribsARBReq); - CARD32 screen, context; - GlxServerVendor *vendor = NULL; REQUEST_AT_LEAST_SIZE(*stuff); - screen = GlxCheckSwap(client, stuff->screen); - context = GlxCheckSwap(client, stuff->context); - LEGAL_NEW_RESOURCE(context, client); - if (screen < screenInfo.numScreens) { - vendor = glxServer.getVendorForScreen(client, screenInfo.screens[screen]); - } - if (vendor != NULL) { - int ret; - if (!glxServer.addXIDMap(context, vendor)) { - return BadAlloc; - } - ret = glxServer.forwardRequest(vendor, client); - if (ret != Success) { - glxServer.removeXIDMap(context); - } - return ret; - } else { - client->errorValue = screen; - return BadMatch; - } + + return forward_xidmap(client, stuff->screen, stuff->context); } + static int dispatch_DestroyPbuffer(ClientPtr client) { REQUEST(xGLXDestroyPbufferReq); @@ -476,22 +379,11 @@ static int dispatch_GetDrawableAttributes(ClientPtr client) static int dispatch_GetFBConfigs(ClientPtr client) { REQUEST(xGLXGetFBConfigsReq); - CARD32 screen; - GlxServerVendor *vendor = NULL; REQUEST_SIZE_MATCH(*stuff); - screen = GlxCheckSwap(client, stuff->screen); - if (screen < screenInfo.numScreens) { - vendor = glxServer.getVendorForScreen(client, screenInfo.screens[screen]); - } - if (vendor != NULL) { - int ret; - ret = glxServer.forwardRequest(vendor, client); - return ret; - } else { - client->errorValue = screen; - return BadMatch; - } + + return forward_simple(client, stuff->screen); } + static int dispatch_QueryContext(ClientPtr client) { REQUEST(xGLXQueryContextReq); diff --git a/hw/xfree86/common/xf86DGA.c b/hw/xfree86/common/xf86DGA.c index 4df4629ab6..ad8011e0ae 100644 --- a/hw/xfree86/common/xf86DGA.c +++ b/hw/xfree86/common/xf86DGA.c @@ -1242,7 +1242,8 @@ ProcXDGAOpenFramebuffer(ClientPtr client) REQUEST_SIZE_MATCH(xXDGAOpenFramebufferReq); - if (stuff->screen >= screenInfo.numScreens) + ScreenPtr pScreen = GetScreenPtr(stuff->screen); + if (!pScreen) return BadValue; if (!DGAAvailable(stuff->screen)) @@ -1276,7 +1277,8 @@ ProcXDGACloseFramebuffer(ClientPtr client) REQUEST_SIZE_MATCH(xXDGACloseFramebufferReq); - if (stuff->screen >= screenInfo.numScreens) + ScreenPtr pScreen = GetScreenPtr(stuff->screen); + if (!pScreen) return BadValue; if (!DGAAvailable(stuff->screen)) @@ -1299,7 +1301,8 @@ ProcXDGAQueryModes(ClientPtr client) REQUEST_SIZE_MATCH(xXDGAQueryModesReq); - if (stuff->screen >= screenInfo.numScreens) + ScreenPtr pScreen = GetScreenPtr(stuff->screen); + if (!pScreen) return BadValue; rep.type = X_Reply; @@ -1415,7 +1418,8 @@ ProcXDGASetMode(ClientPtr client) REQUEST_SIZE_MATCH(xXDGASetModeReq); - if (stuff->screen >= screenInfo.numScreens) + ScreenPtr pScreen = GetScreenPtr(stuff->screen); + if (!pScreen) return BadValue; owner = DGA_GETCLIENT(stuff->screen); @@ -1506,7 +1510,8 @@ ProcXDGASetViewport(ClientPtr client) REQUEST_SIZE_MATCH(xXDGASetViewportReq); - if (stuff->screen >= screenInfo.numScreens) + ScreenPtr pScreen = GetScreenPtr(stuff->screen); + if (!pScreen) return BadValue; if (DGA_GETCLIENT(stuff->screen) != client) @@ -1527,7 +1532,8 @@ ProcXDGAInstallColormap(ClientPtr client) REQUEST_SIZE_MATCH(xXDGAInstallColormapReq); - if (stuff->screen >= screenInfo.numScreens) + ScreenPtr pScreen = GetScreenPtr(stuff->screen); + if (!pScreen) return BadValue; if (DGA_GETCLIENT(stuff->screen) != client) @@ -1548,7 +1554,8 @@ ProcXDGASelectInput(ClientPtr client) REQUEST_SIZE_MATCH(xXDGASelectInputReq); - if (stuff->screen >= screenInfo.numScreens) + ScreenPtr pScreen = GetScreenPtr(stuff->screen); + if (!pScreen) return BadValue; if (DGA_GETCLIENT(stuff->screen) != client) @@ -1567,7 +1574,8 @@ ProcXDGAFillRectangle(ClientPtr client) REQUEST_SIZE_MATCH(xXDGAFillRectangleReq); - if (stuff->screen >= screenInfo.numScreens) + ScreenPtr pScreen = GetScreenPtr(stuff->screen); + if (!pScreen) return BadValue; if (DGA_GETCLIENT(stuff->screen) != client) @@ -1587,7 +1595,8 @@ ProcXDGACopyArea(ClientPtr client) REQUEST_SIZE_MATCH(xXDGACopyAreaReq); - if (stuff->screen >= screenInfo.numScreens) + ScreenPtr pScreen = GetScreenPtr(stuff->screen); + if (pScreen) return BadValue; if (DGA_GETCLIENT(stuff->screen) != client) @@ -1608,7 +1617,8 @@ ProcXDGACopyTransparentArea(ClientPtr client) REQUEST_SIZE_MATCH(xXDGACopyTransparentAreaReq); - if (stuff->screen >= screenInfo.numScreens) + ScreenPtr pScreen = GetScreenPtr(stuff->screen); + if (!pScreen) return BadValue; if (DGA_GETCLIENT(stuff->screen) != client) @@ -1630,7 +1640,8 @@ ProcXDGAGetViewportStatus(ClientPtr client) REQUEST_SIZE_MATCH(xXDGAGetViewportStatusReq); - if (stuff->screen >= screenInfo.numScreens) + ScreenPtr pScreen = GetScreenPtr(stuff->screen); + if (!pScreen) return BadValue; if (DGA_GETCLIENT(stuff->screen) != client) @@ -1654,7 +1665,8 @@ ProcXDGASync(ClientPtr client) REQUEST_SIZE_MATCH(xXDGASyncReq); - if (stuff->screen >= screenInfo.numScreens) + ScreenPtr pScreen = GetScreenPtr(stuff->screen); + if (pScreen) return BadValue; if (DGA_GETCLIENT(stuff->screen) != client) @@ -1700,7 +1712,8 @@ ProcXDGAChangePixmapMode(ClientPtr client) REQUEST_SIZE_MATCH(xXDGAChangePixmapModeReq); - if (stuff->screen >= screenInfo.numScreens) + ScreenPtr pScreen = GetScreenPtr(stuff->screen); + if (!pScreen) return BadValue; if (DGA_GETCLIENT(stuff->screen) != client) @@ -1731,7 +1744,8 @@ ProcXDGACreateColormap(ClientPtr client) REQUEST_SIZE_MATCH(xXDGACreateColormapReq); - if (stuff->screen >= screenInfo.numScreens) + ScreenPtr pScreen = GetScreenPtr(stuff->screen); + if (!pScreen) return BadValue; if (DGA_GETCLIENT(stuff->screen) != client) @@ -1767,7 +1781,8 @@ ProcXF86DGAGetVideoLL(ClientPtr client) REQUEST_SIZE_MATCH(xXF86DGAGetVideoLLReq); - if (stuff->screen >= screenInfo.numScreens) + ScreenPtr pScreen = GetScreenPtr(stuff->screen); + if (!pScreen) return BadValue; rep.type = X_Reply; @@ -1808,7 +1823,8 @@ ProcXF86DGADirectVideo(ClientPtr client) REQUEST_SIZE_MATCH(xXF86DGADirectVideoReq); - if (stuff->screen >= screenInfo.numScreens) + ScreenPtr pScreen = GetScreenPtr(stuff->screen); + if (!pScreen) return BadValue; if (!DGAAvailable(stuff->screen)) @@ -1867,7 +1883,8 @@ ProcXF86DGAGetViewPortSize(ClientPtr client) REQUEST_SIZE_MATCH(xXF86DGAGetViewPortSizeReq); - if (stuff->screen >= screenInfo.numScreens) + ScreenPtr pScreen = GetScreenPtr(stuff->screen); + if (!pScreen) return BadValue; rep.type = X_Reply; @@ -1896,7 +1913,8 @@ ProcXF86DGASetViewPort(ClientPtr client) REQUEST_SIZE_MATCH(xXF86DGASetViewPortReq); - if (stuff->screen >= screenInfo.numScreens) + ScreenPtr pScreen = GetScreenPtr(stuff->screen); + if (!pScreen) return BadValue; if (DGA_GETCLIENT(stuff->screen) != client) @@ -1923,7 +1941,8 @@ ProcXF86DGAGetVidPage(ClientPtr client) REQUEST_SIZE_MATCH(xXF86DGAGetVidPageReq); - if (stuff->screen >= screenInfo.numScreens) + ScreenPtr pScreen = GetScreenPtr(stuff->screen); + if (!pScreen) return BadValue; rep.type = X_Reply; @@ -1942,7 +1961,8 @@ ProcXF86DGASetVidPage(ClientPtr client) REQUEST_SIZE_MATCH(xXF86DGASetVidPageReq); - if (stuff->screen >= screenInfo.numScreens) + ScreenPtr pScreen = GetScreenPtr(stuff->screen); + if (!pScreen) return BadValue; /* silently fail */ @@ -1960,7 +1980,8 @@ ProcXF86DGAInstallColormap(ClientPtr client) REQUEST_SIZE_MATCH(xXF86DGAInstallColormapReq); - if (stuff->screen >= screenInfo.numScreens) + ScreenPtr pScreen = GetScreenPtr(stuff->screen); + if (!pScreen) return BadValue; if (DGA_GETCLIENT(stuff->screen) != client) @@ -1988,7 +2009,8 @@ ProcXF86DGAQueryDirectVideo(ClientPtr client) REQUEST_SIZE_MATCH(xXF86DGAQueryDirectVideoReq); - if (stuff->screen >= screenInfo.numScreens) + ScreenPtr pScreen = GetScreenPtr(stuff->screen); + if (!pScreen) return BadValue; rep.type = X_Reply; @@ -2011,7 +2033,8 @@ ProcXF86DGAViewPortChanged(ClientPtr client) REQUEST_SIZE_MATCH(xXF86DGAViewPortChangedReq); - if (stuff->screen >= screenInfo.numScreens) + ScreenPtr pScreen = GetScreenPtr(stuff->screen); + if (!pScreen) return BadValue; if (DGA_GETCLIENT(stuff->screen) != client)