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:
Peter Hutterer 2012-04-23 10:35:53 +10:00
commit ea51e9b287
2 changed files with 134 additions and 20 deletions

View file

@ -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;