hc
2024-12-19 9370bb92b2d16684ee45cf24e879c93c509162da
kernel/drivers/virt/vboxguest/vboxguest_linux.c
....@@ -5,6 +5,7 @@
55 * Copyright (C) 2006-2016 Oracle Corporation
66 */
77
8
+#include <linux/cred.h>
89 #include <linux/input.h>
910 #include <linux/kernel.h>
1011 #include <linux/miscdevice.h>
....@@ -28,6 +29,23 @@
2829 /** Global vbg_gdev pointer used by vbg_get/put_gdev. */
2930 static struct vbg_dev *vbg_gdev;
3031
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
+
3149 static int vbg_misc_device_open(struct inode *inode, struct file *filp)
3250 {
3351 struct vbg_session *session;
....@@ -36,7 +54,7 @@
3654 /* misc_open sets filp->private_data to our misc device */
3755 gdev = container_of(filp->private_data, struct vbg_dev, misc_device);
3856
39
- session = vbg_core_open_session(gdev, false);
57
+ session = vbg_core_open_session(gdev, vbg_misc_device_requestor(inode));
4058 if (IS_ERR(session))
4159 return PTR_ERR(session);
4260
....@@ -53,7 +71,8 @@
5371 gdev = container_of(filp->private_data, struct vbg_dev,
5472 misc_device_user);
5573
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);
5776 if (IS_ERR(session))
5877 return PTR_ERR(session);
5978
....@@ -116,7 +135,8 @@
116135 req == VBG_IOCTL_VMMDEV_REQUEST_BIG_ALT;
117136
118137 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);
120140 else
121141 buf = kmalloc(size, GFP_KERNEL);
122142 if (!buf)
....@@ -182,13 +202,8 @@
182202 {
183203 struct vbg_dev *gdev = input_get_drvdata(input);
184204 u32 feat = VMMDEV_MOUSE_GUEST_CAN_ABSOLUTE | VMMDEV_MOUSE_NEW_PROTOCOL;
185
- int ret;
186205
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);
192207 }
193208
194209 /**
....@@ -341,8 +356,8 @@
341356 goto err_vbg_core_exit;
342357 }
343358
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);
346361 if (ret) {
347362 vbg_err("vboxguest: Error requesting irq: %d\n", ret);
348363 goto err_vbg_core_exit;
....@@ -352,7 +367,7 @@
352367 if (ret) {
353368 vbg_err("vboxguest: Error misc_register %s failed: %d\n",
354369 DEVICE_NAME, ret);
355
- goto err_vbg_core_exit;
370
+ goto err_free_irq;
356371 }
357372
358373 ret = misc_register(&gdev->misc_device_user);
....@@ -388,6 +403,8 @@
388403 misc_deregister(&gdev->misc_device_user);
389404 err_unregister_misc_device:
390405 misc_deregister(&gdev->misc_device);
406
+err_free_irq:
407
+ free_irq(pci->irq, gdev);
391408 err_vbg_core_exit:
392409 vbg_core_exit(gdev);
393410 err_disable_pcidev:
....@@ -404,6 +421,7 @@
404421 vbg_gdev = NULL;
405422 mutex_unlock(&vbg_gdev_mutex);
406423
424
+ free_irq(pci->irq, gdev);
407425 device_remove_file(gdev->dev, &dev_attr_host_features);
408426 device_remove_file(gdev->dev, &dev_attr_host_version);
409427 misc_deregister(&gdev->misc_device_user);