diff options
author | Peter Hutterer <peter@cs.unisa.edu.au> | 2008-01-18 17:52:38 +1030 |
---|---|---|
committer | Peter Hutterer <peter@cs.unisa.edu.au> | 2008-01-18 17:52:38 +1030 |
commit | 6e17184486c4309ec8b47c7cfd11fef60bb360ac (patch) | |
tree | 53f8cfd0f983562ec5f982025343f647fd7e0c24 | |
parent | b0bf4308acb706abc87c51658c2251fa86231c35 (diff) |
Xi: Check for DestroyAccess when trying to delete a master device.
-rw-r--r-- | Xi/chdevhier.c | 25 |
1 files changed, 19 insertions, 6 deletions
diff --git a/Xi/chdevhier.c b/Xi/chdevhier.c index 0b2e3f1ab..65ff3873b 100644 --- a/Xi/chdevhier.c +++ b/Xi/chdevhier.c @@ -88,9 +88,6 @@ ProcXChangeDeviceHierarchy(ClientPtr client) REQUEST(xChangeDeviceHierarchyReq); REQUEST_AT_LEAST_SIZE(xChangeDeviceHierarchyReq); - /* XXX: check if client is allowed to change hierarch */ - - any = (xAnyHierarchyChangeInfo*)&stuff[1]; while(stuff->num_changes--) { @@ -109,10 +106,13 @@ ProcXChangeDeviceHierarchy(ClientPtr client) char* name; int ret; + /* XXX: check for creation permission */ + SWAPIF(swaps(&c->namelen, n)); name = xcalloc(c->namelen + 1, sizeof(char)); strncpy(name, (char*)&c[1], c->namelen); + ret = AllocMasterDevice(name, &ptr, &keybd); if (ret != Success) { @@ -143,7 +143,7 @@ ProcXChangeDeviceHierarchy(ClientPtr client) return BadValue; rc = dixLookupDevice(&ptr, r->deviceid, client, - DixWriteAccess); + DixDestroyAccess); if (rc != Success) return rc; @@ -160,13 +160,26 @@ ProcXChangeDeviceHierarchy(ClientPtr client) /* disable keyboards first */ if (IsPointerDevice(ptr)) - keybd = ptr->spriteInfo->paired; + { + rc = dixLookupDevice(&keybd, + ptr->spriteInfo->paired->id, + client, + DixDestroyAccess); + if (rc != Success) + return rc; + } else { keybd = ptr; - ptr = keybd->spriteInfo->paired; + rc = dixLookupDevice(&ptr, + keybd->spriteInfo->paired->id, + client, + DixDestroyAccess); + if (rc != Success) + return rc; } + /* Disabling sends the devices floating, reattach them if * desired. */ if (r->returnMode == AttachToMaster) |