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:
Peter Hutterer 2008-04-28 10:26:01 +09:30
parent 684b5d8382
commit b5004722a2
2 changed files with 63 additions and 39 deletions

View File

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

View File

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