Xext: vidmode: tidy up multi-version request control flow, part 3

Some requests using different structs dependending on which protocol version
(v1 vs. v2) had been selected. That's is handled by coverting v1 structs into v2,
before proceeding with the actual handling.

The code flow of this is very complex and hard to understand. Cleaning this up
in several smaller steps, that are easier to digest.

This part moves the request payload structs (or pointers to them) into the
per-version branches. Within each branch following our usual scheme for
extension request handlers (eg. using the REQUEST*() macros and having a
pointer named `stuff` to the current request struct)

Signed-off-by: Enrico Weigelt, metux IT consult <info@metux.net>
This commit is contained in:
Enrico Weigelt, metux IT consult 2024-07-04 20:24:15 +02:00
parent ad26a0595e
commit de636d491b

View File

@ -438,12 +438,7 @@ static int VidModeAddModeLine(ClientPtr client, xXF86VidModeAddModeLineReq* stuf
static int static int
ProcVidModeAddModeLine(ClientPtr client) ProcVidModeAddModeLine(ClientPtr client)
{ {
REQUEST(xXF86VidModeAddModeLineReq);
xXF86OldVidModeAddModeLineReq *oldstuff =
(xXF86OldVidModeAddModeLineReq *) client->requestBuffer;
xXF86VidModeAddModeLineReq newstuff;
int len; int len;
int ver;
/* limited to local-only connections */ /* limited to local-only connections */
if (!VidModeAllowNonLocal && !client->local) if (!VidModeAllowNonLocal && !client->local)
@ -451,55 +446,54 @@ ProcVidModeAddModeLine(ClientPtr client)
DEBUG_P("XF86VidModeAddModeline"); DEBUG_P("XF86VidModeAddModeline");
ver = ClientMajorVersion(client); if (ClientMajorVersion(client) < 2) {
REQUEST(xXF86OldVidModeAddModeLineReq);
if (ver < 2) {
REQUEST_AT_LEAST_SIZE(xXF86OldVidModeAddModeLineReq); REQUEST_AT_LEAST_SIZE(xXF86OldVidModeAddModeLineReq);
len = len =
client->req_len - client->req_len -
bytes_to_int32(sizeof(xXF86OldVidModeAddModeLineReq)); bytes_to_int32(sizeof(xXF86OldVidModeAddModeLineReq));
if (len != oldstuff->privsize) if (len != stuff->privsize)
return BadLength; return BadLength;
xXF86VidModeAddModeLineReq newstuff = {
.length = client->req_len,
.screen = stuff->screen,
.dotclock = stuff->dotclock,
.hdisplay = stuff->hdisplay,
.hsyncstart = stuff->hsyncstart,
.hsyncend = stuff->hsyncend,
.htotal = stuff->htotal,
.hskew = 0,
.vdisplay = stuff->vdisplay,
.vsyncstart = stuff->vsyncstart,
.vsyncend = stuff->vsyncend,
.vtotal = stuff->vtotal,
.flags = stuff->flags,
.privsize = stuff->privsize,
.after_dotclock = stuff->after_dotclock,
.after_hdisplay = stuff->after_hdisplay,
.after_hsyncstart = stuff->after_hsyncstart,
.after_hsyncend = stuff->after_hsyncend,
.after_htotal = stuff->after_htotal,
.after_hskew = 0,
.after_vdisplay = stuff->after_vdisplay,
.after_vsyncstart = stuff->after_vsyncstart,
.after_vsyncend = stuff->after_vsyncend,
.after_vtotal = stuff->after_vtotal,
.after_flags = stuff->after_flags,
};
return VidModeAddModeLine(client, &newstuff);
} }
else { else {
REQUEST(xXF86VidModeAddModeLineReq);
REQUEST_AT_LEAST_SIZE(xXF86VidModeAddModeLineReq); REQUEST_AT_LEAST_SIZE(xXF86VidModeAddModeLineReq);
len = len =
client->req_len - client->req_len -
bytes_to_int32(sizeof(xXF86VidModeAddModeLineReq)); bytes_to_int32(sizeof(xXF86VidModeAddModeLineReq));
if (len != stuff->privsize) if (len != stuff->privsize)
return BadLength; return BadLength;
return VidModeAddModeLine(client, stuff);
} }
if (ver < 2) {
/* convert from old format */
stuff = &newstuff;
stuff->length = client->req_len;
stuff->screen = oldstuff->screen;
stuff->dotclock = oldstuff->dotclock;
stuff->hdisplay = oldstuff->hdisplay;
stuff->hsyncstart = oldstuff->hsyncstart;
stuff->hsyncend = oldstuff->hsyncend;
stuff->htotal = oldstuff->htotal;
stuff->hskew = 0;
stuff->vdisplay = oldstuff->vdisplay;
stuff->vsyncstart = oldstuff->vsyncstart;
stuff->vsyncend = oldstuff->vsyncend;
stuff->vtotal = oldstuff->vtotal;
stuff->flags = oldstuff->flags;
stuff->privsize = oldstuff->privsize;
stuff->after_dotclock = oldstuff->after_dotclock;
stuff->after_hdisplay = oldstuff->after_hdisplay;
stuff->after_hsyncstart = oldstuff->after_hsyncstart;
stuff->after_hsyncend = oldstuff->after_hsyncend;
stuff->after_htotal = oldstuff->after_htotal;
stuff->after_hskew = 0;
stuff->after_vdisplay = oldstuff->after_vdisplay;
stuff->after_vsyncstart = oldstuff->after_vsyncstart;
stuff->after_vsyncend = oldstuff->after_vsyncend;
stuff->after_vtotal = oldstuff->after_vtotal;
stuff->after_flags = oldstuff->after_flags;
}
return VidModeAddModeLine(client, stuff);
} }
static int VidModeAddModeLine(ClientPtr client, xXF86VidModeAddModeLineReq* stuff) static int VidModeAddModeLine(ClientPtr client, xXF86VidModeAddModeLineReq* stuff)
@ -623,12 +617,7 @@ VidModeDeleteModeLine(ClientPtr client, xXF86VidModeDeleteModeLineReq* stuff);
static int static int
ProcVidModeDeleteModeLine(ClientPtr client) ProcVidModeDeleteModeLine(ClientPtr client)
{ {
REQUEST(xXF86VidModeDeleteModeLineReq);
xXF86OldVidModeDeleteModeLineReq *oldstuff =
(xXF86OldVidModeDeleteModeLineReq *) client->requestBuffer;
xXF86VidModeDeleteModeLineReq newstuff;
int len; int len;
int ver;
/* limited to local-only connections */ /* limited to local-only connections */
if (!VidModeAllowNonLocal && !client->local) if (!VidModeAllowNonLocal && !client->local)
@ -636,14 +625,13 @@ ProcVidModeDeleteModeLine(ClientPtr client)
DEBUG_P("XF86VidModeDeleteModeline"); DEBUG_P("XF86VidModeDeleteModeline");
ver = ClientMajorVersion(client); if (ClientMajorVersion(client) < 2) {
REQUEST(xXF86OldVidModeDeleteModeLineReq);
if (ver < 2) {
REQUEST_AT_LEAST_SIZE(xXF86OldVidModeDeleteModeLineReq); REQUEST_AT_LEAST_SIZE(xXF86OldVidModeDeleteModeLineReq);
len = len =
client->req_len - client->req_len -
bytes_to_int32(sizeof(xXF86OldVidModeDeleteModeLineReq)); bytes_to_int32(sizeof(xXF86OldVidModeDeleteModeLineReq));
if (len != oldstuff->privsize) { if (len != stuff->privsize) {
DebugF("req_len = %ld, sizeof(Req) = %d, privsize = %ld, " DebugF("req_len = %ld, sizeof(Req) = %d, privsize = %ld, "
"len = %d, length = %d\n", "len = %d, length = %d\n",
(unsigned long) client->req_len, (unsigned long) client->req_len,
@ -651,8 +639,28 @@ ProcVidModeDeleteModeLine(ClientPtr client)
(unsigned long) stuff->privsize, len, client->req_len); (unsigned long) stuff->privsize, len, client->req_len);
return BadLength; return BadLength;
} }
/* convert from old format */
xXF86VidModeDeleteModeLineReq newstuff = {
.length = client->req_len,
.screen = stuff->screen,
.dotclock = stuff->dotclock,
.hdisplay = stuff->hdisplay,
.hsyncstart = stuff->hsyncstart,
.hsyncend = stuff->hsyncend,
.htotal = stuff->htotal,
.hskew = 0,
.vdisplay = stuff->vdisplay,
.vsyncstart = stuff->vsyncstart,
.vsyncend = stuff->vsyncend,
.vtotal = stuff->vtotal,
.flags = stuff->flags,
.privsize = stuff->privsize,
};
return VidModeDeleteModeLine(client, &newstuff);
} }
else { else {
REQUEST(xXF86VidModeDeleteModeLineReq);
REQUEST_AT_LEAST_SIZE(xXF86VidModeDeleteModeLineReq); REQUEST_AT_LEAST_SIZE(xXF86VidModeDeleteModeLineReq);
len = len =
client->req_len - client->req_len -
@ -665,27 +673,8 @@ ProcVidModeDeleteModeLine(ClientPtr client)
(unsigned long) stuff->privsize, len, client->req_len); (unsigned long) stuff->privsize, len, client->req_len);
return BadLength; return BadLength;
} }
return VidModeDeleteModeLine(client, stuff);
} }
if (ver < 2) {
/* convert from old format */
stuff = &newstuff;
stuff->length = client->req_len;
stuff->screen = oldstuff->screen;
stuff->dotclock = oldstuff->dotclock;
stuff->hdisplay = oldstuff->hdisplay;
stuff->hsyncstart = oldstuff->hsyncstart;
stuff->hsyncend = oldstuff->hsyncend;
stuff->htotal = oldstuff->htotal;
stuff->hskew = 0;
stuff->vdisplay = oldstuff->vdisplay;
stuff->vsyncstart = oldstuff->vsyncstart;
stuff->vsyncend = oldstuff->vsyncend;
stuff->vtotal = oldstuff->vtotal;
stuff->flags = oldstuff->flags;
stuff->privsize = oldstuff->privsize;
}
return VidModeDeleteModeLine(client, stuff);
} }
static int static int
@ -769,12 +758,7 @@ VidModeModModeLine(ClientPtr client, xXF86VidModeModModeLineReq *stuff);
static int static int
ProcVidModeModModeLine(ClientPtr client) ProcVidModeModModeLine(ClientPtr client)
{ {
REQUEST(xXF86VidModeModModeLineReq);
xXF86OldVidModeModModeLineReq *oldstuff =
(xXF86OldVidModeModModeLineReq *) client->requestBuffer;
xXF86VidModeModModeLineReq newstuff;
int len; int len;
int ver;
/* limited to local-only connections */ /* limited to local-only connections */
if (!VidModeAllowNonLocal && !client->local) if (!VidModeAllowNonLocal && !client->local)
@ -782,43 +766,43 @@ ProcVidModeModModeLine(ClientPtr client)
DEBUG_P("XF86VidModeModModeline"); DEBUG_P("XF86VidModeModModeline");
ver = ClientMajorVersion(client); if (ClientMajorVersion(client) < 2) {
REQUEST(xXF86OldVidModeModModeLineReq)
if (ver < 2) {
REQUEST_AT_LEAST_SIZE(xXF86OldVidModeModModeLineReq); REQUEST_AT_LEAST_SIZE(xXF86OldVidModeModModeLineReq);
len = len =
client->req_len - client->req_len -
bytes_to_int32(sizeof(xXF86OldVidModeModModeLineReq)); bytes_to_int32(sizeof(xXF86OldVidModeModModeLineReq));
if (len != oldstuff->privsize) if (len != stuff->privsize)
return BadLength; return BadLength;
/* convert from old format */
xXF86VidModeModModeLineReq newstuff = {
.length = client->req_len,
.screen = stuff->screen,
.hdisplay = stuff->hdisplay,
.hsyncstart = stuff->hsyncstart,
.hsyncend = stuff->hsyncend,
.htotal = stuff->htotal,
.hskew = 0,
.vdisplay = stuff->vdisplay,
.vsyncstart = stuff->vsyncstart,
.vsyncend = stuff->vsyncend,
.vtotal = stuff->vtotal,
.flags = stuff->flags,
.privsize = stuff->privsize,
};
return VidModeModModeLine(client, &newstuff);
} }
else { else {
REQUEST(xXF86VidModeModModeLineReq);
REQUEST_AT_LEAST_SIZE(xXF86VidModeModModeLineReq); REQUEST_AT_LEAST_SIZE(xXF86VidModeModModeLineReq);
len = len =
client->req_len - client->req_len -
bytes_to_int32(sizeof(xXF86VidModeModModeLineReq)); bytes_to_int32(sizeof(xXF86VidModeModModeLineReq));
if (len != stuff->privsize) if (len != stuff->privsize)
return BadLength; return BadLength;
return VidModeModModeLine(client, stuff);
} }
if (ver < 2) {
/* convert from old format */
stuff = &newstuff;
stuff->length = client->req_len;
stuff->screen = oldstuff->screen;
stuff->hdisplay = oldstuff->hdisplay;
stuff->hsyncstart = oldstuff->hsyncstart;
stuff->hsyncend = oldstuff->hsyncend;
stuff->htotal = oldstuff->htotal;
stuff->hskew = 0;
stuff->vdisplay = oldstuff->vdisplay;
stuff->vsyncstart = oldstuff->vsyncstart;
stuff->vsyncend = oldstuff->vsyncend;
stuff->vtotal = oldstuff->vtotal;
stuff->flags = oldstuff->flags;
stuff->privsize = oldstuff->privsize;
}
return VidModeModModeLine(client, stuff);
} }
static int static int
@ -922,52 +906,46 @@ VidModeValidateModeLine(ClientPtr client, xXF86VidModeValidateModeLineReq *stuff
static int static int
ProcVidModeValidateModeLine(ClientPtr client) ProcVidModeValidateModeLine(ClientPtr client)
{ {
REQUEST(xXF86VidModeValidateModeLineReq);
xXF86OldVidModeValidateModeLineReq *oldstuff =
(xXF86OldVidModeValidateModeLineReq *) client->requestBuffer;
xXF86VidModeValidateModeLineReq newstuff;
int len; int len;
int ver;
DEBUG_P("XF86VidModeValidateModeline"); DEBUG_P("XF86VidModeValidateModeline");
ver = ClientMajorVersion(client); if (ClientMajorVersion(client) < 2) {
REQUEST(xXF86OldVidModeValidateModeLineReq);
if (ver < 2) {
REQUEST_AT_LEAST_SIZE(xXF86OldVidModeValidateModeLineReq); REQUEST_AT_LEAST_SIZE(xXF86OldVidModeValidateModeLineReq);
len = client->req_len - len = client->req_len -
bytes_to_int32(sizeof(xXF86OldVidModeValidateModeLineReq)); bytes_to_int32(sizeof(xXF86OldVidModeValidateModeLineReq));
if (len != oldstuff->privsize) if (len != stuff->privsize)
return BadLength; return BadLength;
xXF86VidModeValidateModeLineReq newstuff = {
.length = client->req_len,
.screen = stuff->screen,
.dotclock = stuff->dotclock,
.hdisplay = stuff->hdisplay,
.hsyncstart = stuff->hsyncstart,
.hsyncend = stuff->hsyncend,
.htotal = stuff->htotal,
.hskew = 0,
.vdisplay = stuff->vdisplay,
.vsyncstart = stuff->vsyncstart,
.vsyncend = stuff->vsyncend,
.vtotal = stuff->vtotal,
.flags = stuff->flags,
.privsize = stuff->privsize,
};
return VidModeValidateModeLine(client, &newstuff);
} }
else { else {
REQUEST(xXF86VidModeValidateModeLineReq);
REQUEST_AT_LEAST_SIZE(xXF86VidModeValidateModeLineReq); REQUEST_AT_LEAST_SIZE(xXF86VidModeValidateModeLineReq);
len = len =
client->req_len - client->req_len -
bytes_to_int32(sizeof(xXF86VidModeValidateModeLineReq)); bytes_to_int32(sizeof(xXF86VidModeValidateModeLineReq));
if (len != stuff->privsize) if (len != stuff->privsize)
return BadLength; return BadLength;
return VidModeValidateModeLine(client, stuff);
} }
if (ver < 2) {
/* convert from old format */
stuff = &newstuff;
stuff->length = client->req_len;
stuff->screen = oldstuff->screen;
stuff->dotclock = oldstuff->dotclock;
stuff->hdisplay = oldstuff->hdisplay;
stuff->hsyncstart = oldstuff->hsyncstart;
stuff->hsyncend = oldstuff->hsyncend;
stuff->htotal = oldstuff->htotal;
stuff->hskew = 0;
stuff->vdisplay = oldstuff->vdisplay;
stuff->vsyncstart = oldstuff->vsyncstart;
stuff->vsyncend = oldstuff->vsyncend;
stuff->vtotal = oldstuff->vtotal;
stuff->flags = oldstuff->flags;
stuff->privsize = oldstuff->privsize;
}
return VidModeValidateModeLine(client, stuff);
} }
static int static int
@ -1093,12 +1071,7 @@ VidModeSwitchToMode(ClientPtr client, xXF86VidModeSwitchToModeReq *stuff);
static int static int
ProcVidModeSwitchToMode(ClientPtr client) ProcVidModeSwitchToMode(ClientPtr client)
{ {
REQUEST(xXF86VidModeSwitchToModeReq);
xXF86OldVidModeSwitchToModeReq *oldstuff =
(xXF86OldVidModeSwitchToModeReq *) client->requestBuffer;
xXF86VidModeSwitchToModeReq newstuff;
int len; int len;
int ver;
DEBUG_P("XF86VidModeSwitchToMode"); DEBUG_P("XF86VidModeSwitchToMode");
@ -1106,44 +1079,44 @@ ProcVidModeSwitchToMode(ClientPtr client)
if (!VidModeAllowNonLocal && !client->local) if (!VidModeAllowNonLocal && !client->local)
return VidModeErrorBase + XF86VidModeClientNotLocal; return VidModeErrorBase + XF86VidModeClientNotLocal;
ver = ClientMajorVersion(client); if (ClientMajorVersion(client) < 2) {
REQUEST(xXF86OldVidModeSwitchToModeReq);
if (ver < 2) {
REQUEST_AT_LEAST_SIZE(xXF86OldVidModeSwitchToModeReq); REQUEST_AT_LEAST_SIZE(xXF86OldVidModeSwitchToModeReq);
len = len =
client->req_len - client->req_len -
bytes_to_int32(sizeof(xXF86OldVidModeSwitchToModeReq)); bytes_to_int32(sizeof(xXF86OldVidModeSwitchToModeReq));
if (len != stuff->privsize) if (len != stuff->privsize)
return BadLength; return BadLength;
/* convert from old format */
xXF86VidModeSwitchToModeReq newstuff = {
.length = client->req_len,
.screen = stuff->screen,
.dotclock = stuff->dotclock,
.hdisplay = stuff->hdisplay,
.hsyncstart = stuff->hsyncstart,
.hsyncend = stuff->hsyncend,
.htotal = stuff->htotal,
.hskew = 0,
.vdisplay = stuff->vdisplay,
.vsyncstart = stuff->vsyncstart,
.vsyncend = stuff->vsyncend,
.vtotal = stuff->vtotal,
.flags = stuff->flags,
.privsize = stuff->privsize,
};
return VidModeSwitchToMode(client, &newstuff);
} }
else { else {
REQUEST(xXF86VidModeSwitchToModeReq);
REQUEST_AT_LEAST_SIZE(xXF86VidModeSwitchToModeReq); REQUEST_AT_LEAST_SIZE(xXF86VidModeSwitchToModeReq);
len = len =
client->req_len - client->req_len -
bytes_to_int32(sizeof(xXF86VidModeSwitchToModeReq)); bytes_to_int32(sizeof(xXF86VidModeSwitchToModeReq));
if (len != stuff->privsize) if (len != stuff->privsize)
return BadLength; return BadLength;
return VidModeSwitchToMode(client, stuff);
} }
if (ver < 2) {
/* convert from old format */
stuff = &newstuff;
stuff->length = client->req_len;
stuff->screen = oldstuff->screen;
stuff->dotclock = oldstuff->dotclock;
stuff->hdisplay = oldstuff->hdisplay;
stuff->hsyncstart = oldstuff->hsyncstart;
stuff->hsyncend = oldstuff->hsyncend;
stuff->htotal = oldstuff->htotal;
stuff->hskew = 0;
stuff->vdisplay = oldstuff->vdisplay;
stuff->vsyncstart = oldstuff->vsyncstart;
stuff->vsyncend = oldstuff->vsyncend;
stuff->vtotal = oldstuff->vtotal;
stuff->flags = oldstuff->flags;
stuff->privsize = oldstuff->privsize;
}
return VidModeSwitchToMode(client, stuff);
} }
static int static int