xf86dga2.c & xf86vmode.c: Move REQUEST_SIZE_MATCH checks before using stuff

Seems silly waiting to check if the client failed to send us enough bytes
until after we've already tried using them.

Signed-off-by: Alan Coopersmith <alan.coopersmith@oracle.com>
Reviewed-by: Keith Packard <keithp@keithp.com>
Tested-by: Daniel Stone <daniel@fooishbar.org>
This commit is contained in:
Alan Coopersmith 2012-07-09 19:12:42 -07:00
parent 2e739a8870
commit ef0f701c92
2 changed files with 52 additions and 41 deletions

View File

@ -96,13 +96,14 @@ ProcXDGAOpenFramebuffer(ClientPtr client)
char *deviceName; char *deviceName;
int nameSize; int nameSize;
REQUEST_SIZE_MATCH(xXDGAOpenFramebufferReq);
if (stuff->screen >= screenInfo.numScreens) if (stuff->screen >= screenInfo.numScreens)
return BadValue; return BadValue;
if (!DGAAvailable(stuff->screen)) if (!DGAAvailable(stuff->screen))
return DGAErrorBase + XF86DGANoDirectVideoMode; return DGAErrorBase + XF86DGANoDirectVideoMode;
REQUEST_SIZE_MATCH(xXDGAOpenFramebufferReq);
rep.type = X_Reply; rep.type = X_Reply;
rep.length = 0; rep.length = 0;
rep.sequenceNumber = client->sequence; rep.sequenceNumber = client->sequence;
@ -129,14 +130,14 @@ ProcXDGACloseFramebuffer(ClientPtr client)
{ {
REQUEST(xXDGACloseFramebufferReq); REQUEST(xXDGACloseFramebufferReq);
REQUEST_SIZE_MATCH(xXDGACloseFramebufferReq);
if (stuff->screen >= screenInfo.numScreens) if (stuff->screen >= screenInfo.numScreens)
return BadValue; return BadValue;
if (!DGAAvailable(stuff->screen)) if (!DGAAvailable(stuff->screen))
return DGAErrorBase + XF86DGANoDirectVideoMode; return DGAErrorBase + XF86DGANoDirectVideoMode;
REQUEST_SIZE_MATCH(xXDGACloseFramebufferReq);
DGACloseFramebuffer(stuff->screen); DGACloseFramebuffer(stuff->screen);
return Success; return Success;
@ -152,10 +153,11 @@ ProcXDGAQueryModes(ClientPtr client)
xXDGAModeInfo info; xXDGAModeInfo info;
XDGAModePtr mode; XDGAModePtr mode;
REQUEST_SIZE_MATCH(xXDGAQueryModesReq);
if (stuff->screen >= screenInfo.numScreens) if (stuff->screen >= screenInfo.numScreens)
return BadValue; return BadValue;
REQUEST_SIZE_MATCH(xXDGAQueryModesReq);
rep.type = X_Reply; rep.type = X_Reply;
rep.length = 0; rep.length = 0;
rep.number = 0; rep.number = 0;
@ -267,11 +269,12 @@ ProcXDGASetMode(ClientPtr client)
ClientPtr owner; ClientPtr owner;
int size; int size;
REQUEST_SIZE_MATCH(xXDGASetModeReq);
if (stuff->screen >= screenInfo.numScreens) if (stuff->screen >= screenInfo.numScreens)
return BadValue; return BadValue;
owner = DGA_GETCLIENT(stuff->screen); owner = DGA_GETCLIENT(stuff->screen);
REQUEST_SIZE_MATCH(xXDGASetModeReq);
rep.type = X_Reply; rep.type = X_Reply;
rep.length = 0; rep.length = 0;
rep.offset = 0; rep.offset = 0;
@ -357,14 +360,14 @@ ProcXDGASetViewport(ClientPtr client)
{ {
REQUEST(xXDGASetViewportReq); REQUEST(xXDGASetViewportReq);
REQUEST_SIZE_MATCH(xXDGASetViewportReq);
if (stuff->screen >= screenInfo.numScreens) if (stuff->screen >= screenInfo.numScreens)
return BadValue; return BadValue;
if (DGA_GETCLIENT(stuff->screen) != client) if (DGA_GETCLIENT(stuff->screen) != client)
return DGAErrorBase + XF86DGADirectNotActivated; return DGAErrorBase + XF86DGADirectNotActivated;
REQUEST_SIZE_MATCH(xXDGASetViewportReq);
DGASetViewport(stuff->screen, stuff->x, stuff->y, stuff->flags); DGASetViewport(stuff->screen, stuff->x, stuff->y, stuff->flags);
return Success; return Success;
@ -378,14 +381,14 @@ ProcXDGAInstallColormap(ClientPtr client)
REQUEST(xXDGAInstallColormapReq); REQUEST(xXDGAInstallColormapReq);
REQUEST_SIZE_MATCH(xXDGAInstallColormapReq);
if (stuff->screen >= screenInfo.numScreens) if (stuff->screen >= screenInfo.numScreens)
return BadValue; return BadValue;
if (DGA_GETCLIENT(stuff->screen) != client) if (DGA_GETCLIENT(stuff->screen) != client)
return DGAErrorBase + XF86DGADirectNotActivated; return DGAErrorBase + XF86DGADirectNotActivated;
REQUEST_SIZE_MATCH(xXDGAInstallColormapReq);
rc = dixLookupResourceByType((pointer *) &cmap, stuff->cmap, RT_COLORMAP, rc = dixLookupResourceByType((pointer *) &cmap, stuff->cmap, RT_COLORMAP,
client, DixInstallAccess); client, DixInstallAccess);
if (rc != Success) if (rc != Success)
@ -399,14 +402,14 @@ ProcXDGASelectInput(ClientPtr client)
{ {
REQUEST(xXDGASelectInputReq); REQUEST(xXDGASelectInputReq);
REQUEST_SIZE_MATCH(xXDGASelectInputReq);
if (stuff->screen >= screenInfo.numScreens) if (stuff->screen >= screenInfo.numScreens)
return BadValue; return BadValue;
if (DGA_GETCLIENT(stuff->screen) != client) if (DGA_GETCLIENT(stuff->screen) != client)
return DGAErrorBase + XF86DGADirectNotActivated; return DGAErrorBase + XF86DGADirectNotActivated;
REQUEST_SIZE_MATCH(xXDGASelectInputReq);
if (DGA_GETCLIENT(stuff->screen) == client) if (DGA_GETCLIENT(stuff->screen) == client)
DGASelectInput(stuff->screen, client, stuff->mask); DGASelectInput(stuff->screen, client, stuff->mask);
@ -418,14 +421,14 @@ ProcXDGAFillRectangle(ClientPtr client)
{ {
REQUEST(xXDGAFillRectangleReq); REQUEST(xXDGAFillRectangleReq);
REQUEST_SIZE_MATCH(xXDGAFillRectangleReq);
if (stuff->screen >= screenInfo.numScreens) if (stuff->screen >= screenInfo.numScreens)
return BadValue; return BadValue;
if (DGA_GETCLIENT(stuff->screen) != client) if (DGA_GETCLIENT(stuff->screen) != client)
return DGAErrorBase + XF86DGADirectNotActivated; return DGAErrorBase + XF86DGADirectNotActivated;
REQUEST_SIZE_MATCH(xXDGAFillRectangleReq);
if (Success != DGAFillRect(stuff->screen, stuff->x, stuff->y, if (Success != DGAFillRect(stuff->screen, stuff->x, stuff->y,
stuff->width, stuff->height, stuff->color)) stuff->width, stuff->height, stuff->color))
return BadMatch; return BadMatch;
@ -438,14 +441,14 @@ ProcXDGACopyArea(ClientPtr client)
{ {
REQUEST(xXDGACopyAreaReq); REQUEST(xXDGACopyAreaReq);
REQUEST_SIZE_MATCH(xXDGACopyAreaReq);
if (stuff->screen >= screenInfo.numScreens) if (stuff->screen >= screenInfo.numScreens)
return BadValue; return BadValue;
if (DGA_GETCLIENT(stuff->screen) != client) if (DGA_GETCLIENT(stuff->screen) != client)
return DGAErrorBase + XF86DGADirectNotActivated; return DGAErrorBase + XF86DGADirectNotActivated;
REQUEST_SIZE_MATCH(xXDGACopyAreaReq);
if (Success != DGABlitRect(stuff->screen, stuff->srcx, stuff->srcy, if (Success != DGABlitRect(stuff->screen, stuff->srcx, stuff->srcy,
stuff->width, stuff->height, stuff->dstx, stuff->width, stuff->height, stuff->dstx,
stuff->dsty)) stuff->dsty))
@ -459,14 +462,14 @@ ProcXDGACopyTransparentArea(ClientPtr client)
{ {
REQUEST(xXDGACopyTransparentAreaReq); REQUEST(xXDGACopyTransparentAreaReq);
REQUEST_SIZE_MATCH(xXDGACopyTransparentAreaReq);
if (stuff->screen >= screenInfo.numScreens) if (stuff->screen >= screenInfo.numScreens)
return BadValue; return BadValue;
if (DGA_GETCLIENT(stuff->screen) != client) if (DGA_GETCLIENT(stuff->screen) != client)
return DGAErrorBase + XF86DGADirectNotActivated; return DGAErrorBase + XF86DGADirectNotActivated;
REQUEST_SIZE_MATCH(xXDGACopyTransparentAreaReq);
if (Success != DGABlitTransRect(stuff->screen, stuff->srcx, stuff->srcy, if (Success != DGABlitTransRect(stuff->screen, stuff->srcx, stuff->srcy,
stuff->width, stuff->height, stuff->dstx, stuff->width, stuff->height, stuff->dstx,
stuff->dsty, stuff->key)) stuff->dsty, stuff->key))
@ -481,13 +484,14 @@ ProcXDGAGetViewportStatus(ClientPtr client)
REQUEST(xXDGAGetViewportStatusReq); REQUEST(xXDGAGetViewportStatusReq);
xXDGAGetViewportStatusReply rep; xXDGAGetViewportStatusReply rep;
REQUEST_SIZE_MATCH(xXDGAGetViewportStatusReq);
if (stuff->screen >= screenInfo.numScreens) if (stuff->screen >= screenInfo.numScreens)
return BadValue; return BadValue;
if (DGA_GETCLIENT(stuff->screen) != client) if (DGA_GETCLIENT(stuff->screen) != client)
return DGAErrorBase + XF86DGADirectNotActivated; return DGAErrorBase + XF86DGADirectNotActivated;
REQUEST_SIZE_MATCH(xXDGAGetViewportStatusReq);
rep.type = X_Reply; rep.type = X_Reply;
rep.length = 0; rep.length = 0;
rep.sequenceNumber = client->sequence; rep.sequenceNumber = client->sequence;
@ -504,13 +508,14 @@ ProcXDGASync(ClientPtr client)
REQUEST(xXDGASyncReq); REQUEST(xXDGASyncReq);
xXDGASyncReply rep; xXDGASyncReply rep;
REQUEST_SIZE_MATCH(xXDGASyncReq);
if (stuff->screen >= screenInfo.numScreens) if (stuff->screen >= screenInfo.numScreens)
return BadValue; return BadValue;
if (DGA_GETCLIENT(stuff->screen) != client) if (DGA_GETCLIENT(stuff->screen) != client)
return DGAErrorBase + XF86DGADirectNotActivated; return DGAErrorBase + XF86DGADirectNotActivated;
REQUEST_SIZE_MATCH(xXDGASyncReq);
rep.type = X_Reply; rep.type = X_Reply;
rep.length = 0; rep.length = 0;
rep.sequenceNumber = client->sequence; rep.sequenceNumber = client->sequence;
@ -549,13 +554,14 @@ ProcXDGAChangePixmapMode(ClientPtr client)
xXDGAChangePixmapModeReply rep; xXDGAChangePixmapModeReply rep;
int x, y; int x, y;
REQUEST_SIZE_MATCH(xXDGAChangePixmapModeReq);
if (stuff->screen >= screenInfo.numScreens) if (stuff->screen >= screenInfo.numScreens)
return BadValue; return BadValue;
if (DGA_GETCLIENT(stuff->screen) != client) if (DGA_GETCLIENT(stuff->screen) != client)
return DGAErrorBase + XF86DGADirectNotActivated; return DGAErrorBase + XF86DGADirectNotActivated;
REQUEST_SIZE_MATCH(xXDGAChangePixmapModeReq);
rep.type = X_Reply; rep.type = X_Reply;
rep.length = 0; rep.length = 0;
rep.sequenceNumber = client->sequence; rep.sequenceNumber = client->sequence;
@ -579,14 +585,14 @@ ProcXDGACreateColormap(ClientPtr client)
REQUEST(xXDGACreateColormapReq); REQUEST(xXDGACreateColormapReq);
int result; int result;
REQUEST_SIZE_MATCH(xXDGACreateColormapReq);
if (stuff->screen >= screenInfo.numScreens) if (stuff->screen >= screenInfo.numScreens)
return BadValue; return BadValue;
if (DGA_GETCLIENT(stuff->screen) != client) if (DGA_GETCLIENT(stuff->screen) != client)
return DGAErrorBase + XF86DGADirectNotActivated; return DGAErrorBase + XF86DGADirectNotActivated;
REQUEST_SIZE_MATCH(xXDGACreateColormapReq);
if (!stuff->mode) if (!stuff->mode)
return BadValue; return BadValue;
@ -615,10 +621,11 @@ ProcXF86DGAGetVideoLL(ClientPtr client)
int num, offset, flags; int num, offset, flags;
char *name; char *name;
REQUEST_SIZE_MATCH(xXF86DGAGetVideoLLReq);
if (stuff->screen >= screenInfo.numScreens) if (stuff->screen >= screenInfo.numScreens)
return BadValue; return BadValue;
REQUEST_SIZE_MATCH(xXF86DGAGetVideoLLReq);
rep.type = X_Reply; rep.type = X_Reply;
rep.length = 0; rep.length = 0;
rep.sequenceNumber = client->sequence; rep.sequenceNumber = client->sequence;
@ -655,9 +662,10 @@ ProcXF86DGADirectVideo(ClientPtr client)
REQUEST(xXF86DGADirectVideoReq); REQUEST(xXF86DGADirectVideoReq);
REQUEST_SIZE_MATCH(xXF86DGADirectVideoReq);
if (stuff->screen >= screenInfo.numScreens) if (stuff->screen >= screenInfo.numScreens)
return BadValue; return BadValue;
REQUEST_SIZE_MATCH(xXF86DGADirectVideoReq);
if (!DGAAvailable(stuff->screen)) if (!DGAAvailable(stuff->screen))
return DGAErrorBase + XF86DGANoDirectVideoMode; return DGAErrorBase + XF86DGANoDirectVideoMode;
@ -713,10 +721,11 @@ ProcXF86DGAGetViewPortSize(ClientPtr client)
REQUEST(xXF86DGAGetViewPortSizeReq); REQUEST(xXF86DGAGetViewPortSizeReq);
xXF86DGAGetViewPortSizeReply rep; xXF86DGAGetViewPortSizeReply rep;
REQUEST_SIZE_MATCH(xXF86DGAGetViewPortSizeReq);
if (stuff->screen >= screenInfo.numScreens) if (stuff->screen >= screenInfo.numScreens)
return BadValue; return BadValue;
REQUEST_SIZE_MATCH(xXF86DGAGetViewPortSizeReq);
rep.type = X_Reply; rep.type = X_Reply;
rep.length = 0; rep.length = 0;
rep.sequenceNumber = client->sequence; rep.sequenceNumber = client->sequence;
@ -741,14 +750,14 @@ ProcXF86DGASetViewPort(ClientPtr client)
{ {
REQUEST(xXF86DGASetViewPortReq); REQUEST(xXF86DGASetViewPortReq);
REQUEST_SIZE_MATCH(xXF86DGASetViewPortReq);
if (stuff->screen >= screenInfo.numScreens) if (stuff->screen >= screenInfo.numScreens)
return BadValue; return BadValue;
if (DGA_GETCLIENT(stuff->screen) != client) if (DGA_GETCLIENT(stuff->screen) != client)
return DGAErrorBase + XF86DGADirectNotActivated; return DGAErrorBase + XF86DGADirectNotActivated;
REQUEST_SIZE_MATCH(xXF86DGASetViewPortReq);
if (!DGAAvailable(stuff->screen)) if (!DGAAvailable(stuff->screen))
return DGAErrorBase + XF86DGANoDirectVideoMode; return DGAErrorBase + XF86DGANoDirectVideoMode;
@ -768,10 +777,11 @@ ProcXF86DGAGetVidPage(ClientPtr client)
REQUEST(xXF86DGAGetVidPageReq); REQUEST(xXF86DGAGetVidPageReq);
xXF86DGAGetVidPageReply rep; xXF86DGAGetVidPageReply rep;
REQUEST_SIZE_MATCH(xXF86DGAGetVidPageReq);
if (stuff->screen >= screenInfo.numScreens) if (stuff->screen >= screenInfo.numScreens)
return BadValue; return BadValue;
REQUEST_SIZE_MATCH(xXF86DGAGetVidPageReq);
rep.type = X_Reply; rep.type = X_Reply;
rep.length = 0; rep.length = 0;
rep.sequenceNumber = client->sequence; rep.sequenceNumber = client->sequence;
@ -786,11 +796,11 @@ ProcXF86DGASetVidPage(ClientPtr client)
{ {
REQUEST(xXF86DGASetVidPageReq); REQUEST(xXF86DGASetVidPageReq);
REQUEST_SIZE_MATCH(xXF86DGASetVidPageReq);
if (stuff->screen >= screenInfo.numScreens) if (stuff->screen >= screenInfo.numScreens)
return BadValue; return BadValue;
REQUEST_SIZE_MATCH(xXF86DGASetVidPageReq);
/* silently fail */ /* silently fail */
return Success; return Success;
@ -804,14 +814,14 @@ ProcXF86DGAInstallColormap(ClientPtr client)
REQUEST(xXF86DGAInstallColormapReq); REQUEST(xXF86DGAInstallColormapReq);
REQUEST_SIZE_MATCH(xXF86DGAInstallColormapReq);
if (stuff->screen >= screenInfo.numScreens) if (stuff->screen >= screenInfo.numScreens)
return BadValue; return BadValue;
if (DGA_GETCLIENT(stuff->screen) != client) if (DGA_GETCLIENT(stuff->screen) != client)
return DGAErrorBase + XF86DGADirectNotActivated; return DGAErrorBase + XF86DGADirectNotActivated;
REQUEST_SIZE_MATCH(xXF86DGAInstallColormapReq);
if (!DGAActive(stuff->screen)) if (!DGAActive(stuff->screen))
return DGAErrorBase + XF86DGADirectNotActivated; return DGAErrorBase + XF86DGADirectNotActivated;
@ -832,10 +842,11 @@ ProcXF86DGAQueryDirectVideo(ClientPtr client)
REQUEST(xXF86DGAQueryDirectVideoReq); REQUEST(xXF86DGAQueryDirectVideoReq);
xXF86DGAQueryDirectVideoReply rep; xXF86DGAQueryDirectVideoReply rep;
REQUEST_SIZE_MATCH(xXF86DGAQueryDirectVideoReq);
if (stuff->screen >= screenInfo.numScreens) if (stuff->screen >= screenInfo.numScreens)
return BadValue; return BadValue;
REQUEST_SIZE_MATCH(xXF86DGAQueryDirectVideoReq);
rep.type = X_Reply; rep.type = X_Reply;
rep.length = 0; rep.length = 0;
rep.sequenceNumber = client->sequence; rep.sequenceNumber = client->sequence;
@ -854,14 +865,14 @@ ProcXF86DGAViewPortChanged(ClientPtr client)
REQUEST(xXF86DGAViewPortChangedReq); REQUEST(xXF86DGAViewPortChangedReq);
xXF86DGAViewPortChangedReply rep; xXF86DGAViewPortChangedReply rep;
REQUEST_SIZE_MATCH(xXF86DGAViewPortChangedReq);
if (stuff->screen >= screenInfo.numScreens) if (stuff->screen >= screenInfo.numScreens)
return BadValue; return BadValue;
if (DGA_GETCLIENT(stuff->screen) != client) if (DGA_GETCLIENT(stuff->screen) != client)
return DGAErrorBase + XF86DGADirectNotActivated; return DGAErrorBase + XF86DGADirectNotActivated;
REQUEST_SIZE_MATCH(xXF86DGAViewPortChangedReq);
if (!DGAActive(stuff->screen)) if (!DGAActive(stuff->screen))
return DGAErrorBase + XF86DGADirectNotActivated; return DGAErrorBase + XF86DGADirectNotActivated;

View File

@ -1481,14 +1481,14 @@ ProcXF86VidModeGetGammaRamp(ClientPtr client)
REQUEST(xXF86VidModeGetGammaRampReq); REQUEST(xXF86VidModeGetGammaRampReq);
REQUEST_SIZE_MATCH(xXF86VidModeGetGammaRampReq);
if (stuff->screen >= screenInfo.numScreens) if (stuff->screen >= screenInfo.numScreens)
return BadValue; return BadValue;
if (stuff->size != VidModeGetGammaRampSize(stuff->screen)) if (stuff->size != VidModeGetGammaRampSize(stuff->screen))
return BadValue; return BadValue;
REQUEST_SIZE_MATCH(xXF86VidModeGetGammaRampReq);
length = (stuff->size + 1) & ~1; length = (stuff->size + 1) & ~1;
if (stuff->size) { if (stuff->size) {
@ -1529,11 +1529,11 @@ ProcXF86VidModeGetGammaRampSize(ClientPtr client)
REQUEST(xXF86VidModeGetGammaRampSizeReq); REQUEST(xXF86VidModeGetGammaRampSizeReq);
REQUEST_SIZE_MATCH(xXF86VidModeGetGammaRampSizeReq);
if (stuff->screen >= screenInfo.numScreens) if (stuff->screen >= screenInfo.numScreens)
return BadValue; return BadValue;
REQUEST_SIZE_MATCH(xXF86VidModeGetGammaRampSizeReq);
rep.type = X_Reply; rep.type = X_Reply;
rep.length = 0; rep.length = 0;
rep.sequenceNumber = client->sequence; rep.sequenceNumber = client->sequence;
@ -1555,11 +1555,11 @@ ProcXF86VidModeGetPermissions(ClientPtr client)
REQUEST(xXF86VidModeGetPermissionsReq); REQUEST(xXF86VidModeGetPermissionsReq);
REQUEST_SIZE_MATCH(xXF86VidModeGetPermissionsReq);
if (stuff->screen >= screenInfo.numScreens) if (stuff->screen >= screenInfo.numScreens)
return BadValue; return BadValue;
REQUEST_SIZE_MATCH(xXF86VidModeGetPermissionsReq);
rep.type = X_Reply; rep.type = X_Reply;
rep.length = 0; rep.length = 0;
rep.sequenceNumber = client->sequence; rep.sequenceNumber = client->sequence;