Xi: Only return VCP, VCK and floating SDs to Xi 1.x clients.
This is better than the approach implemented with
8973a3f798
which disabled XI altogether for 1.x.
Instead, return a device list that resembles a traditional XI setup on pre XI
2.0 servers. If the client tries to open a device other than a floating SD,
return a BadDevice error.
This commit is contained in:
parent
684b5d8382
commit
b5004722a2
91
Xi/listdev.c
91
Xi/listdev.c
|
@ -315,9 +315,9 @@ CopySwapClasses(ClientPtr client, DeviceIntPtr dev, CARD8 *num_classes,
|
||||||
* This procedure lists the input devices available to the server.
|
* This procedure lists the input devices available to the server.
|
||||||
*
|
*
|
||||||
* If this request is called by a client that has not issued a
|
* If this request is called by a client that has not issued a
|
||||||
* GetExtensionVersion request with major/minor version set, we pretend no
|
* GetExtensionVersion request with major/minor version set, we don't send the
|
||||||
* devices are available. It's the only thing we can do to stop pre-XI 2
|
* complete device list. Instead, we only send the VCP, the VCK and floating
|
||||||
* clients.
|
* SDs. This resembles the setup found on XI 1.x machines.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
int
|
int
|
||||||
|
@ -347,34 +347,35 @@ ProcXListInputDevices(ClientPtr client)
|
||||||
|
|
||||||
AddOtherInputDevices();
|
AddOtherInputDevices();
|
||||||
|
|
||||||
if (pXIClient->major_version >= XI_2_Major) {
|
for (d = inputInfo.devices; d; d = d->next) {
|
||||||
for (d = inputInfo.devices; d; d = d->next) {
|
if (pXIClient->major_version < XI_2_Major)
|
||||||
rc = XaceHook(XACE_DEVICE_ACCESS, client, d, DixGetAttrAccess);
|
{
|
||||||
if (rc != Success)
|
if (d->isMaster &&
|
||||||
return rc;
|
d != inputInfo.pointer &&
|
||||||
SizeDeviceInfo(d, &namesize, &size);
|
d != inputInfo.keyboard)
|
||||||
numdevs++;
|
continue; /* don't send master devices other than VCP/VCK */
|
||||||
}
|
|
||||||
for (d = inputInfo.off_devices; d; d = d->next) {
|
|
||||||
rc = XaceHook(XACE_DEVICE_ACCESS, client, d, DixGetAttrAccess);
|
|
||||||
if (rc != Success)
|
|
||||||
return rc;
|
|
||||||
SizeDeviceInfo(d, &namesize, &size);
|
|
||||||
numdevs++;
|
|
||||||
}
|
|
||||||
} else
|
|
||||||
{
|
|
||||||
/* Pretend we don't have XI devices connected */
|
|
||||||
rc = XaceHook(XACE_DEVICE_ACCESS, client, inputInfo.pointer, DixGetAttrAccess);
|
|
||||||
if (rc != Success)
|
|
||||||
return rc;
|
|
||||||
rc = XaceHook(XACE_DEVICE_ACCESS, client, inputInfo.keyboard, DixGetAttrAccess);
|
|
||||||
if (rc != Success)
|
|
||||||
return rc;
|
|
||||||
|
|
||||||
SizeDeviceInfo(inputInfo.pointer, &namesize, &size);
|
if (!d->isMaster && d->u.master)
|
||||||
SizeDeviceInfo(inputInfo.keyboard, &namesize, &size);
|
continue; /* don't send attached SDs */
|
||||||
numdevs = 2;
|
}
|
||||||
|
rc = XaceHook(XACE_DEVICE_ACCESS, client, d, DixGetAttrAccess);
|
||||||
|
if (rc != Success)
|
||||||
|
return rc;
|
||||||
|
SizeDeviceInfo(d, &namesize, &size);
|
||||||
|
numdevs++;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (d = inputInfo.off_devices; d; d = d->next) {
|
||||||
|
if (pXIClient->major_version < XI_2_Major &&
|
||||||
|
!d->isMaster &&
|
||||||
|
d->u.master) /* XXX can off_devices be attached? */
|
||||||
|
continue; /* don't send attached SDs */
|
||||||
|
|
||||||
|
rc = XaceHook(XACE_DEVICE_ACCESS, client, d, DixGetAttrAccess);
|
||||||
|
if (rc != Success)
|
||||||
|
return rc;
|
||||||
|
SizeDeviceInfo(d, &namesize, &size);
|
||||||
|
numdevs++;
|
||||||
}
|
}
|
||||||
|
|
||||||
total_length = numdevs * sizeof(xDeviceInfo) + size + namesize;
|
total_length = numdevs * sizeof(xDeviceInfo) + size + namesize;
|
||||||
|
@ -384,18 +385,30 @@ ProcXListInputDevices(ClientPtr client)
|
||||||
savbuf = devbuf;
|
savbuf = devbuf;
|
||||||
|
|
||||||
dev = (xDeviceInfoPtr) devbuf;
|
dev = (xDeviceInfoPtr) devbuf;
|
||||||
if (pXIClient->major_version >= XI_2_Major)
|
for (d = inputInfo.devices; d; d = d->next)
|
||||||
{
|
{
|
||||||
for (d = inputInfo.devices; d; d = d->next, dev++)
|
if (pXIClient->major_version < XI_2_Major)
|
||||||
ListDeviceInfo(client, d, dev, &devbuf, &classbuf, &namebuf);
|
{
|
||||||
for (d = inputInfo.off_devices; d; d = d->next, dev++)
|
if (d->isMaster &&
|
||||||
ListDeviceInfo(client, d, dev, &devbuf, &classbuf, &namebuf);
|
d != inputInfo.pointer &&
|
||||||
} else
|
d != inputInfo.keyboard)
|
||||||
{
|
continue; /* don't count master devices other than VCP/VCK */
|
||||||
ListDeviceInfo(client, inputInfo.pointer, dev, &devbuf, &classbuf, &namebuf);
|
|
||||||
ListDeviceInfo(client, inputInfo.keyboard, dev, &devbuf, &classbuf, &namebuf);
|
if (!d->isMaster && d->u.master)
|
||||||
|
continue; /* don't count attached SDs */
|
||||||
|
}
|
||||||
|
ListDeviceInfo(client, d, dev++, &devbuf, &classbuf, &namebuf);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
for (d = inputInfo.off_devices; d; d = d->next)
|
||||||
|
{
|
||||||
|
if (pXIClient->major_version < XI_2_Major &&
|
||||||
|
!d->isMaster &&
|
||||||
|
d->u.master) /* XXX can off_devices be attached? */
|
||||||
|
continue; /* don't send attached SDs */
|
||||||
|
|
||||||
|
ListDeviceInfo(client, d, dev++, &devbuf, &classbuf, &namebuf);
|
||||||
|
}
|
||||||
rep.ndevices = numdevs;
|
rep.ndevices = numdevs;
|
||||||
rep.length = (total_length + 3) >> 2;
|
rep.length = (total_length + 3) >> 2;
|
||||||
WriteReplyToClient(client, sizeof(xListInputDevicesReply), &rep);
|
WriteReplyToClient(client, sizeof(xListInputDevicesReply), &rep);
|
||||||
|
|
11
Xi/opendev.c
11
Xi/opendev.c
|
@ -62,6 +62,7 @@ SOFTWARE.
|
||||||
#include "XIstubs.h"
|
#include "XIstubs.h"
|
||||||
#include "windowstr.h" /* window structure */
|
#include "windowstr.h" /* window structure */
|
||||||
#include "exglobals.h"
|
#include "exglobals.h"
|
||||||
|
#include "exevents.h"
|
||||||
|
|
||||||
#include "opendev.h"
|
#include "opendev.h"
|
||||||
|
|
||||||
|
@ -98,6 +99,7 @@ ProcXOpenDevice(ClientPtr client)
|
||||||
int status = Success;
|
int status = Success;
|
||||||
xOpenDeviceReply rep;
|
xOpenDeviceReply rep;
|
||||||
DeviceIntPtr dev;
|
DeviceIntPtr dev;
|
||||||
|
XIClientPtr pXIClient;
|
||||||
|
|
||||||
REQUEST(xOpenDeviceReq);
|
REQUEST(xOpenDeviceReq);
|
||||||
REQUEST_SIZE_MATCH(xOpenDeviceReq);
|
REQUEST_SIZE_MATCH(xOpenDeviceReq);
|
||||||
|
@ -113,6 +115,15 @@ ProcXOpenDevice(ClientPtr client)
|
||||||
} else if (status != Success)
|
} else if (status != Success)
|
||||||
return status;
|
return status;
|
||||||
|
|
||||||
|
/* Don't let XI 1.x clients open devices other than floating SDs. */
|
||||||
|
pXIClient = dixLookupPrivate(&client->devPrivates, XIClientPrivateKey);
|
||||||
|
if (pXIClient->major_version < XI_2_Major)
|
||||||
|
{
|
||||||
|
if (dev->isMaster || (!dev->isMaster && dev->u.master))
|
||||||
|
return BadDevice;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
OpenInputDevice(dev, client, &status);
|
OpenInputDevice(dev, client, &status);
|
||||||
if (status != Success)
|
if (status != Success)
|
||||||
return status;
|
return status;
|
||||||
|
|
Loading…
Reference in New Issue