[PATCH xserver] present: cap the version returned to the client

Emil Velikov emil.l.velikov at gmail.com
Wed Mar 21 15:28:33 UTC 2018


On 21 March 2018 at 08:02, Julien Cristau <jcristau at debian.org> wrote:
> On Mon, Mar 19, 2018 at 16:04:43 +0000, Emil Velikov wrote:
>
>> From: Emil Velikov <emil.velikov at collabora.com>
>>
>> As per the protocol, the server should not return version greater than
>> the one supported by the client.
>>
>> Add a spec quote and tweak the numbers accordingly.
>>
>> Fixes: 5c5c1b77982 ("present: Add Present extension")
>> Cc: Thierry Reding <treding at nvidia.com>
>> Cc: Daniel Stone <daniels at collabora.com>
>> Cc: Keith Packard <keithp at keithp.com>
>> Signed-off-by: Emil Velikov <emil.velikov at collabora.com>
>> ---
>> Analogous to the DRI3 patch here
>> https://patchwork.freedesktop.org/patch/210343/
>> ---
>>  present/present_request.c | 14 +++++++++++++-
>>  1 file changed, 13 insertions(+), 1 deletion(-)
>>
>> diff --git a/present/present_request.c b/present/present_request.c
>> index c6afe5fa7..f52efa52b 100644
>> --- a/present/present_request.c
>> +++ b/present/present_request.c
>> @@ -41,7 +41,19 @@ proc_present_query_version(ClientPtr client)
>>      };
>>
>>      REQUEST_SIZE_MATCH(xPresentQueryVersionReq);
>> -    (void) stuff;
>> +    /* From presentproto:
>> +     *
>> +     * The client sends the highest supported version to the server
>> +     * and the server sends the highest version it supports, but no
>> +     * higher than the requested version.
>> +     */
>> +
>> +    if (rep.majorVersion > stuff->majorVersion ||
>> +        rep.minorVersion > stuff->minorVersion) {
>> +        rep.majorVersion = stuff->majorVersion;
>> +        rep.minorVersion = stuff->minorVersion;
>> +    }
>
> Doesn't this break when e.g. client supports 2.2 and server supports
> 1.4, where we'll return 2.2 instead of 1.4?

Present has never bumped major, so things should be fine.
in fact only two extensions have done so - DRI2 and XFIXES - more
details on those below.

That said, I'll tweak the checks (this + dri3) to handle more corner
cases. The original issue was that server was returning greater
version than the one requested.

-Emil

DRI3 never saw a v1 release, while the history behind XFIXES is very
messy - here's a brief.

804a9fda12f70e66feac5e45bc8293a7e436689b
1.0 -> 2.0: introduced new events/requests, broke one existing event

f92db7128c857b3925846a9c8519e9554a1c67e2
no version change: _lots_ of breakage

2e9a7b2004d943eaf1be1778c94790528c573cb1
2.0 -> 4.0: introduced new events/requests, changed version meaning
major: incompatible -> new requests
minor: only BC changes -> only minor adjustments or BC changes

9760b4bdd1f9fdd6a33b9f876c4a835ed969aa84
4.0 -> 5.0: introduced new events/requests


More information about the xorg-devel mailing list