Xi: add XACE hooks for device creation (ChangeDeviceHierarchy)

AddInputDevice checks for permissions already, so all we do is modify a few
callers to let AID sort it out.
This commit is contained in:
Peter Hutterer 2008-01-21 23:43:53 +10:30
parent 6492d513c0
commit ba315ae5dd
7 changed files with 21 additions and 18 deletions

View File

@ -52,6 +52,7 @@ from the author.
#include "exevents.h" #include "exevents.h"
#include "exglobals.h" #include "exglobals.h"
#include "geext.h" #include "geext.h"
#include "xace.h"
#include "chdevhier.h" #include "chdevhier.h"
@ -104,20 +105,17 @@ ProcXChangeDeviceHierarchy(ClientPtr client)
{ {
xCreateMasterInfo* c = (xCreateMasterInfo*)any; xCreateMasterInfo* c = (xCreateMasterInfo*)any;
char* name; char* name;
int ret;
/* XXX: check for creation permission */
SWAPIF(swaps(&c->namelen, n)); SWAPIF(swaps(&c->namelen, n));
name = xcalloc(c->namelen + 1, sizeof(char)); name = xcalloc(c->namelen + 1, sizeof(char));
strncpy(name, (char*)&c[1], c->namelen); strncpy(name, (char*)&c[1], c->namelen);
ret = AllocMasterDevice(name, &ptr, &keybd); rc = AllocMasterDevice(client, name, &ptr, &keybd);
if (ret != Success) if (rc != Success)
{ {
xfree(name); xfree(name);
return ret; return rc;
} }
if (!c->sendCore) if (!c->sendCore)

View File

@ -100,7 +100,7 @@ DevPrivateKey CoreDevicePrivateKey = &CoreDevicePrivateKey;
* @return The newly created device. * @return The newly created device.
*/ */
DeviceIntPtr DeviceIntPtr
AddInputDevice(DeviceProc deviceProc, Bool autoStart) AddInputDevice(ClientPtr client, DeviceProc deviceProc, Bool autoStart)
{ {
DeviceIntPtr dev, *prev; /* not a typo */ DeviceIntPtr dev, *prev; /* not a typo */
DeviceIntPtr devtmp; DeviceIntPtr devtmp;
@ -562,9 +562,9 @@ CorePointerProc(DeviceIntPtr pDev, int what)
void void
InitCoreDevices(void) InitCoreDevices(void)
{ {
if (AllocMasterDevice("Virtual core", if (AllocMasterDevice(serverClient, "Virtual core",
&inputInfo.pointer, &inputInfo.pointer,
&inputInfo.keyboard) == BadAlloc) &inputInfo.keyboard) != Success)
FatalError("Failed to allocate core devices"); FatalError("Failed to allocate core devices");
} }
@ -2597,13 +2597,13 @@ NextFreePointerDevice()
* EnableDevice() manually. * EnableDevice() manually.
*/ */
int int
AllocMasterDevice(char* name, DeviceIntPtr* ptr, DeviceIntPtr* keybd) AllocMasterDevice(ClientPtr client, char* name, DeviceIntPtr* ptr, DeviceIntPtr* keybd)
{ {
DeviceIntPtr pointer; DeviceIntPtr pointer;
DeviceIntPtr keyboard; DeviceIntPtr keyboard;
*ptr = *keybd = NULL; *ptr = *keybd = NULL;
pointer = AddInputDevice(CorePointerProc, TRUE); pointer = AddInputDevice(client, CorePointerProc, TRUE);
if (!pointer) if (!pointer)
return BadAlloc; return BadAlloc;
@ -2628,7 +2628,7 @@ AllocMasterDevice(char* name, DeviceIntPtr* ptr, DeviceIntPtr* keybd)
pointer->u.lastSlave = NULL; pointer->u.lastSlave = NULL;
pointer->isMaster = TRUE; pointer->isMaster = TRUE;
keyboard = AddInputDevice(CoreKeyboardProc, TRUE); keyboard = AddInputDevice(client, CoreKeyboardProc, TRUE);
if (!keyboard) if (!keyboard)
return BadAlloc; return BadAlloc;

View File

@ -318,8 +318,8 @@ void
InitInput(int argc, char *argv[]) InitInput(int argc, char *argv[])
{ {
DeviceIntPtr p, k; DeviceIntPtr p, k;
p = AddInputDevice(vfbMouseProc, TRUE); p = AddInputDevice(serverClient, vfbMouseProc, TRUE);
k = AddInputDevice(vfbKeybdProc, TRUE); k = AddInputDevice(serverClient, vfbKeybdProc, TRUE);
RegisterPointerDevice(p); RegisterPointerDevice(p);
RegisterKeyboardDevice(k); RegisterKeyboardDevice(k);
(void)mieqInit(); (void)mieqInit();

View File

@ -158,7 +158,7 @@ xf86ActivateDevice(LocalDevicePtr local)
DeviceIntPtr dev; DeviceIntPtr dev;
if (local->flags & XI86_CONFIGURED) { if (local->flags & XI86_CONFIGURED) {
dev = AddInputDevice(local->device_control, TRUE); dev = AddInputDevice(serverClient, local->device_control, TRUE);
if (dev == NULL) if (dev == NULL)
FatalError("Too many input devices"); FatalError("Too many input devices");

View File

@ -89,8 +89,8 @@ InitOutput(ScreenInfo *screenInfo, int argc, char *argv[])
void void
InitInput(int argc, char *argv[]) InitInput(int argc, char *argv[])
{ {
xnestPointerDevice = AddInputDevice(xnestPointerProc, TRUE); xnestPointerDevice = AddInputDevice(serverClient, xnestPointerProc, TRUE);
xnestKeyboardDevice = AddInputDevice(xnestKeyboardProc, TRUE); xnestKeyboardDevice = AddInputDevice(serverClient, xnestKeyboardProc, TRUE);
if (!xnestEvents) if (!xnestEvents)
xnestEvents = (xEvent *) xcalloc(sizeof(xEvent), GetMaximumEventsNum()); xnestEvents = (xEvent *) xcalloc(sizeof(xEvent), GetMaximumEventsNum());

View File

@ -180,6 +180,7 @@ typedef struct _InputOption {
extern void InitCoreDevices(void); extern void InitCoreDevices(void);
extern DeviceIntPtr AddInputDevice( extern DeviceIntPtr AddInputDevice(
ClientPtr /*client*/,
DeviceProc /*deviceProc*/, DeviceProc /*deviceProc*/,
Bool /*autoStart*/); Bool /*autoStart*/);
@ -471,7 +472,8 @@ extern Bool RegisterPairingClient(ClientPtr client);
extern DeviceIntPtr GuessFreePointerDevice(void); extern DeviceIntPtr GuessFreePointerDevice(void);
extern DeviceIntPtr NextFreePointerDevice(void); extern DeviceIntPtr NextFreePointerDevice(void);
extern int AllocMasterDevice(char* name, extern int AllocMasterDevice(ClientPtr client,
char* name,
DeviceIntPtr* ptr, DeviceIntPtr* ptr,
DeviceIntPtr* keybd); DeviceIntPtr* keybd);
extern void DeepCopyDeviceClasses(DeviceIntPtr from, extern void DeepCopyDeviceClasses(DeviceIntPtr from,

View File

@ -63,6 +63,9 @@ XkbSrvLedInfoPtr sli;
sli= XkbFindSrvLedInfo(dev,XkbDfltXIClass,XkbDfltXIId,0); sli= XkbFindSrvLedInfo(dev,XkbDfltXIClass,XkbDfltXIId,0);
if (!sli)
return update;
if (state_changes&(XkbModifierStateMask|XkbGroupStateMask)) if (state_changes&(XkbModifierStateMask|XkbGroupStateMask))
update|= sli->usesEffective; update|= sli->usesEffective;
if (state_changes&(XkbModifierBaseMask|XkbGroupBaseMask)) if (state_changes&(XkbModifierBaseMask|XkbGroupBaseMask))