mirror of
https://github.com/X11Libre/xserver.git
synced 2026-10-09 23:22:22 +00:00
Xi: return BadValue on XIQueryVersion if the version is less than first call
Clients that use plugin systems may require multiple calls to
XIQueryVersion from different plugins. The current error handling requires
client-side synchronisation of version numbers.
The first call to XIQueryVersion defines the server behaviour. Once cached,
always return that version number to any clients. Unless a client requests a
version lower than the first defined one, then a BadValue must be returned
to be protocol-compatible.
Introduced in 2c23ef83b0
Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
Reviewed-by: Jeremy Huddleston <jeremyhu@apple.com>
This commit is contained in:
parent
93d6ba5b71
commit
ea51e9b287
2 changed files with 134 additions and 20 deletions
|
|
@ -70,27 +70,28 @@ ProcXIQueryVersion(ClientPtr client)
|
|||
|
||||
pXIClient = dixLookupPrivate(&client->devPrivates, XIClientPrivateKey);
|
||||
|
||||
if (pXIClient->major_version &&
|
||||
(stuff->major_version != pXIClient->major_version ||
|
||||
stuff->minor_version != pXIClient->minor_version))
|
||||
{
|
||||
client->errorValue = stuff->major_version;
|
||||
return BadValue;
|
||||
}
|
||||
if (pXIClient->major_version) {
|
||||
if (version_compare(stuff->major_version, stuff->minor_version,
|
||||
pXIClient->major_version, pXIClient->minor_version) < 0) {
|
||||
client->errorValue = stuff->major_version;
|
||||
return BadValue;
|
||||
}
|
||||
major = pXIClient->major_version;
|
||||
minor = pXIClient->minor_version;
|
||||
} else {
|
||||
if (version_compare(XIVersion.major_version, XIVersion.minor_version,
|
||||
stuff->major_version, stuff->minor_version) > 0) {
|
||||
major = stuff->major_version;
|
||||
minor = stuff->minor_version;
|
||||
}
|
||||
else {
|
||||
major = XIVersion.major_version;
|
||||
minor = XIVersion.minor_version;
|
||||
}
|
||||
|
||||
|
||||
if (version_compare(XIVersion.major_version, XIVersion.minor_version,
|
||||
stuff->major_version, stuff->minor_version) > 0) {
|
||||
major = stuff->major_version;
|
||||
minor = stuff->minor_version;
|
||||
pXIClient->major_version = major;
|
||||
pXIClient->minor_version = minor;
|
||||
}
|
||||
else {
|
||||
major = XIVersion.major_version;
|
||||
minor = XIVersion.minor_version;
|
||||
}
|
||||
|
||||
pXIClient->major_version = major;
|
||||
pXIClient->minor_version = minor;
|
||||
|
||||
memset(&rep, 0, sizeof(xXIQueryVersionReply));
|
||||
rep.repType = X_Reply;
|
||||
|
|
|
|||
Loading…
Reference in a new issue