in tools/driver/drivers/gasket/gasket_ioctl.c [129:160]
static uint gasket_ioctl_check_permissions(struct gasket_dev *gasket_dev,
struct file *filp, uint cmd) {
uint alive, root, device_owner;
fmode_t read, write;
alive = (gasket_dev->status == GASKET_STATUS_ALIVE);
root = capable(CAP_SYS_ADMIN);
read = filp->f_mode & FMODE_READ;
write = filp->f_mode & FMODE_WRITE;
device_owner = (gasket_dev->ownership.is_owned &&
current->tgid == gasket_dev->ownership.owner);
switch (cmd) {
case GASKET_IOCTL_RESET:
case GASKET_IOCTL_CLEAR_INTERRUPT_COUNTS:
return root || (write && device_owner);
case GASKET_IOCTL_PAGE_TABLE_SIZE:
case GASKET_IOCTL_SIMPLE_PAGE_TABLE_SIZE:
case GASKET_IOCTL_NUMBER_PAGE_TABLES:
return root || read;
case GASKET_IOCTL_PARTITION_PAGE_TABLE:
return alive && (root || (write && device_owner));
case GASKET_IOCTL_MAP_BUFFER:
case GASKET_IOCTL_UNMAP_BUFFER:
case GASKET_IOCTL_MAP_DMA_BUF:
return alive && (root || (write && device_owner));
case GASKET_IOCTL_CLEAR_EVENTFD:
case GASKET_IOCTL_SET_EVENTFD:
case GASKET_IOCTL_REGISTER_INTERRUPT:
case GASKET_IOCTL_UNREGISTER_INTERRUPT:
return alive && (root || (write && device_owner));
}
return 0;
}