.. | .. |
---|
5 | 5 | * Copyright (C) 2006-2016 Oracle Corporation |
---|
6 | 6 | */ |
---|
7 | 7 | |
---|
| 8 | +#include <linux/cred.h> |
---|
8 | 9 | #include <linux/input.h> |
---|
9 | 10 | #include <linux/kernel.h> |
---|
10 | 11 | #include <linux/miscdevice.h> |
---|
.. | .. |
---|
28 | 29 | /** Global vbg_gdev pointer used by vbg_get/put_gdev. */ |
---|
29 | 30 | static struct vbg_dev *vbg_gdev; |
---|
30 | 31 | |
---|
| 32 | +static u32 vbg_misc_device_requestor(struct inode *inode) |
---|
| 33 | +{ |
---|
| 34 | + u32 requestor = VMMDEV_REQUESTOR_USERMODE | |
---|
| 35 | + VMMDEV_REQUESTOR_CON_DONT_KNOW | |
---|
| 36 | + VMMDEV_REQUESTOR_TRUST_NOT_GIVEN; |
---|
| 37 | + |
---|
| 38 | + if (from_kuid(current_user_ns(), current_uid()) == 0) |
---|
| 39 | + requestor |= VMMDEV_REQUESTOR_USR_ROOT; |
---|
| 40 | + else |
---|
| 41 | + requestor |= VMMDEV_REQUESTOR_USR_USER; |
---|
| 42 | + |
---|
| 43 | + if (in_egroup_p(inode->i_gid)) |
---|
| 44 | + requestor |= VMMDEV_REQUESTOR_GRP_VBOX; |
---|
| 45 | + |
---|
| 46 | + return requestor; |
---|
| 47 | +} |
---|
| 48 | + |
---|
31 | 49 | static int vbg_misc_device_open(struct inode *inode, struct file *filp) |
---|
32 | 50 | { |
---|
33 | 51 | struct vbg_session *session; |
---|
.. | .. |
---|
36 | 54 | /* misc_open sets filp->private_data to our misc device */ |
---|
37 | 55 | gdev = container_of(filp->private_data, struct vbg_dev, misc_device); |
---|
38 | 56 | |
---|
39 | | - session = vbg_core_open_session(gdev, false); |
---|
| 57 | + session = vbg_core_open_session(gdev, vbg_misc_device_requestor(inode)); |
---|
40 | 58 | if (IS_ERR(session)) |
---|
41 | 59 | return PTR_ERR(session); |
---|
42 | 60 | |
---|
.. | .. |
---|
53 | 71 | gdev = container_of(filp->private_data, struct vbg_dev, |
---|
54 | 72 | misc_device_user); |
---|
55 | 73 | |
---|
56 | | - session = vbg_core_open_session(gdev, false); |
---|
| 74 | + session = vbg_core_open_session(gdev, vbg_misc_device_requestor(inode) | |
---|
| 75 | + VMMDEV_REQUESTOR_USER_DEVICE); |
---|
57 | 76 | if (IS_ERR(session)) |
---|
58 | 77 | return PTR_ERR(session); |
---|
59 | 78 | |
---|
.. | .. |
---|
116 | 135 | req == VBG_IOCTL_VMMDEV_REQUEST_BIG_ALT; |
---|
117 | 136 | |
---|
118 | 137 | if (is_vmmdev_req) |
---|
119 | | - buf = vbg_req_alloc(size, VBG_IOCTL_HDR_TYPE_DEFAULT); |
---|
| 138 | + buf = vbg_req_alloc(size, VBG_IOCTL_HDR_TYPE_DEFAULT, |
---|
| 139 | + session->requestor); |
---|
120 | 140 | else |
---|
121 | 141 | buf = kmalloc(size, GFP_KERNEL); |
---|
122 | 142 | if (!buf) |
---|
.. | .. |
---|
182 | 202 | { |
---|
183 | 203 | struct vbg_dev *gdev = input_get_drvdata(input); |
---|
184 | 204 | u32 feat = VMMDEV_MOUSE_GUEST_CAN_ABSOLUTE | VMMDEV_MOUSE_NEW_PROTOCOL; |
---|
185 | | - int ret; |
---|
186 | 205 | |
---|
187 | | - ret = vbg_core_set_mouse_status(gdev, feat); |
---|
188 | | - if (ret) |
---|
189 | | - return ret; |
---|
190 | | - |
---|
191 | | - return 0; |
---|
| 206 | + return vbg_core_set_mouse_status(gdev, feat); |
---|
192 | 207 | } |
---|
193 | 208 | |
---|
194 | 209 | /** |
---|
.. | .. |
---|
341 | 356 | goto err_vbg_core_exit; |
---|
342 | 357 | } |
---|
343 | 358 | |
---|
344 | | - ret = devm_request_irq(dev, pci->irq, vbg_core_isr, IRQF_SHARED, |
---|
345 | | - DEVICE_NAME, gdev); |
---|
| 359 | + ret = request_irq(pci->irq, vbg_core_isr, IRQF_SHARED, DEVICE_NAME, |
---|
| 360 | + gdev); |
---|
346 | 361 | if (ret) { |
---|
347 | 362 | vbg_err("vboxguest: Error requesting irq: %d\n", ret); |
---|
348 | 363 | goto err_vbg_core_exit; |
---|
.. | .. |
---|
352 | 367 | if (ret) { |
---|
353 | 368 | vbg_err("vboxguest: Error misc_register %s failed: %d\n", |
---|
354 | 369 | DEVICE_NAME, ret); |
---|
355 | | - goto err_vbg_core_exit; |
---|
| 370 | + goto err_free_irq; |
---|
356 | 371 | } |
---|
357 | 372 | |
---|
358 | 373 | ret = misc_register(&gdev->misc_device_user); |
---|
.. | .. |
---|
388 | 403 | misc_deregister(&gdev->misc_device_user); |
---|
389 | 404 | err_unregister_misc_device: |
---|
390 | 405 | misc_deregister(&gdev->misc_device); |
---|
| 406 | +err_free_irq: |
---|
| 407 | + free_irq(pci->irq, gdev); |
---|
391 | 408 | err_vbg_core_exit: |
---|
392 | 409 | vbg_core_exit(gdev); |
---|
393 | 410 | err_disable_pcidev: |
---|
.. | .. |
---|
404 | 421 | vbg_gdev = NULL; |
---|
405 | 422 | mutex_unlock(&vbg_gdev_mutex); |
---|
406 | 423 | |
---|
| 424 | + free_irq(pci->irq, gdev); |
---|
407 | 425 | device_remove_file(gdev->dev, &dev_attr_host_features); |
---|
408 | 426 | device_remove_file(gdev->dev, &dev_attr_host_version); |
---|
409 | 427 | misc_deregister(&gdev->misc_device_user); |
---|