27
27
28
28
#define GUEST_MAPPINGS_TRIES 5
29
29
30
+ #define VBG_KERNEL_REQUEST \
31
+ (VMMDEV_REQUESTOR_KERNEL | VMMDEV_REQUESTOR_USR_DRV | \
32
+ VMMDEV_REQUESTOR_CON_DONT_KNOW | VMMDEV_REQUESTOR_TRUST_NOT_GIVEN)
33
+
30
34
/**
31
35
* Reserves memory in which the VMM can relocate any guest mappings
32
36
* that are floating around.
@@ -48,7 +52,8 @@ static void vbg_guest_mappings_init(struct vbg_dev *gdev)
48
52
int i , rc ;
49
53
50
54
/* Query the required space. */
51
- req = vbg_req_alloc (sizeof (* req ), VMMDEVREQ_GET_HYPERVISOR_INFO );
55
+ req = vbg_req_alloc (sizeof (* req ), VMMDEVREQ_GET_HYPERVISOR_INFO ,
56
+ VBG_KERNEL_REQUEST );
52
57
if (!req )
53
58
return ;
54
59
@@ -135,7 +140,8 @@ static void vbg_guest_mappings_exit(struct vbg_dev *gdev)
135
140
* Tell the host that we're going to free the memory we reserved for
136
141
* it, the free it up. (Leak the memory if anything goes wrong here.)
137
142
*/
138
- req = vbg_req_alloc (sizeof (* req ), VMMDEVREQ_SET_HYPERVISOR_INFO );
143
+ req = vbg_req_alloc (sizeof (* req ), VMMDEVREQ_SET_HYPERVISOR_INFO ,
144
+ VBG_KERNEL_REQUEST );
139
145
if (!req )
140
146
return ;
141
147
@@ -172,8 +178,10 @@ static int vbg_report_guest_info(struct vbg_dev *gdev)
172
178
struct vmmdev_guest_info2 * req2 = NULL ;
173
179
int rc , ret = - ENOMEM ;
174
180
175
- req1 = vbg_req_alloc (sizeof (* req1 ), VMMDEVREQ_REPORT_GUEST_INFO );
176
- req2 = vbg_req_alloc (sizeof (* req2 ), VMMDEVREQ_REPORT_GUEST_INFO2 );
181
+ req1 = vbg_req_alloc (sizeof (* req1 ), VMMDEVREQ_REPORT_GUEST_INFO ,
182
+ VBG_KERNEL_REQUEST );
183
+ req2 = vbg_req_alloc (sizeof (* req2 ), VMMDEVREQ_REPORT_GUEST_INFO2 ,
184
+ VBG_KERNEL_REQUEST );
177
185
if (!req1 || !req2 )
178
186
goto out_free ;
179
187
@@ -187,8 +195,8 @@ static int vbg_report_guest_info(struct vbg_dev *gdev)
187
195
req2 -> additions_minor = VBG_VERSION_MINOR ;
188
196
req2 -> additions_build = VBG_VERSION_BUILD ;
189
197
req2 -> additions_revision = VBG_SVN_REV ;
190
- /* (no features defined yet) */
191
- req2 -> additions_features = 0 ;
198
+ req2 -> additions_features =
199
+ VMMDEV_GUEST_INFO2_ADDITIONS_FEATURES_REQUESTOR_INFO ;
192
200
strlcpy (req2 -> name , VBG_VERSION_STRING ,
193
201
sizeof (req2 -> name ));
194
202
@@ -230,7 +238,8 @@ static int vbg_report_driver_status(struct vbg_dev *gdev, bool active)
230
238
struct vmmdev_guest_status * req ;
231
239
int rc ;
232
240
233
- req = vbg_req_alloc (sizeof (* req ), VMMDEVREQ_REPORT_GUEST_STATUS );
241
+ req = vbg_req_alloc (sizeof (* req ), VMMDEVREQ_REPORT_GUEST_STATUS ,
242
+ VBG_KERNEL_REQUEST );
234
243
if (!req )
235
244
return - ENOMEM ;
236
245
@@ -423,7 +432,8 @@ static int vbg_heartbeat_host_config(struct vbg_dev *gdev, bool enabled)
423
432
struct vmmdev_heartbeat * req ;
424
433
int rc ;
425
434
426
- req = vbg_req_alloc (sizeof (* req ), VMMDEVREQ_HEARTBEAT_CONFIGURE );
435
+ req = vbg_req_alloc (sizeof (* req ), VMMDEVREQ_HEARTBEAT_CONFIGURE ,
436
+ VBG_KERNEL_REQUEST );
427
437
if (!req )
428
438
return - ENOMEM ;
429
439
@@ -457,7 +467,8 @@ static int vbg_heartbeat_init(struct vbg_dev *gdev)
457
467
458
468
gdev -> guest_heartbeat_req = vbg_req_alloc (
459
469
sizeof (* gdev -> guest_heartbeat_req ),
460
- VMMDEVREQ_GUEST_HEARTBEAT );
470
+ VMMDEVREQ_GUEST_HEARTBEAT ,
471
+ VBG_KERNEL_REQUEST );
461
472
if (!gdev -> guest_heartbeat_req )
462
473
return - ENOMEM ;
463
474
@@ -528,7 +539,8 @@ static int vbg_reset_host_event_filter(struct vbg_dev *gdev,
528
539
struct vmmdev_mask * req ;
529
540
int rc ;
530
541
531
- req = vbg_req_alloc (sizeof (* req ), VMMDEVREQ_CTL_GUEST_FILTER_MASK );
542
+ req = vbg_req_alloc (sizeof (* req ), VMMDEVREQ_CTL_GUEST_FILTER_MASK ,
543
+ VBG_KERNEL_REQUEST );
532
544
if (!req )
533
545
return - ENOMEM ;
534
546
@@ -567,8 +579,14 @@ static int vbg_set_session_event_filter(struct vbg_dev *gdev,
567
579
u32 changed , previous ;
568
580
int rc , ret = 0 ;
569
581
570
- /* Allocate a request buffer before taking the spinlock */
571
- req = vbg_req_alloc (sizeof (* req ), VMMDEVREQ_CTL_GUEST_FILTER_MASK );
582
+ /*
583
+ * Allocate a request buffer before taking the spinlock, when
584
+ * the session is being terminated the requestor is the kernel,
585
+ * as we're cleaning up.
586
+ */
587
+ req = vbg_req_alloc (sizeof (* req ), VMMDEVREQ_CTL_GUEST_FILTER_MASK ,
588
+ session_termination ? VBG_KERNEL_REQUEST :
589
+ session -> requestor );
572
590
if (!req ) {
573
591
if (!session_termination )
574
592
return - ENOMEM ;
@@ -627,7 +645,8 @@ static int vbg_reset_host_capabilities(struct vbg_dev *gdev)
627
645
struct vmmdev_mask * req ;
628
646
int rc ;
629
647
630
- req = vbg_req_alloc (sizeof (* req ), VMMDEVREQ_SET_GUEST_CAPABILITIES );
648
+ req = vbg_req_alloc (sizeof (* req ), VMMDEVREQ_SET_GUEST_CAPABILITIES ,
649
+ VBG_KERNEL_REQUEST );
631
650
if (!req )
632
651
return - ENOMEM ;
633
652
@@ -662,8 +681,14 @@ static int vbg_set_session_capabilities(struct vbg_dev *gdev,
662
681
u32 changed , previous ;
663
682
int rc , ret = 0 ;
664
683
665
- /* Allocate a request buffer before taking the spinlock */
666
- req = vbg_req_alloc (sizeof (* req ), VMMDEVREQ_SET_GUEST_CAPABILITIES );
684
+ /*
685
+ * Allocate a request buffer before taking the spinlock, when
686
+ * the session is being terminated the requestor is the kernel,
687
+ * as we're cleaning up.
688
+ */
689
+ req = vbg_req_alloc (sizeof (* req ), VMMDEVREQ_SET_GUEST_CAPABILITIES ,
690
+ session_termination ? VBG_KERNEL_REQUEST :
691
+ session -> requestor );
667
692
if (!req ) {
668
693
if (!session_termination )
669
694
return - ENOMEM ;
@@ -722,7 +747,8 @@ static int vbg_query_host_version(struct vbg_dev *gdev)
722
747
struct vmmdev_host_version * req ;
723
748
int rc , ret ;
724
749
725
- req = vbg_req_alloc (sizeof (* req ), VMMDEVREQ_GET_HOST_VERSION );
750
+ req = vbg_req_alloc (sizeof (* req ), VMMDEVREQ_GET_HOST_VERSION ,
751
+ VBG_KERNEL_REQUEST );
726
752
if (!req )
727
753
return - ENOMEM ;
728
754
@@ -783,19 +809,24 @@ int vbg_core_init(struct vbg_dev *gdev, u32 fixed_events)
783
809
784
810
gdev -> mem_balloon .get_req =
785
811
vbg_req_alloc (sizeof (* gdev -> mem_balloon .get_req ),
786
- VMMDEVREQ_GET_MEMBALLOON_CHANGE_REQ );
812
+ VMMDEVREQ_GET_MEMBALLOON_CHANGE_REQ ,
813
+ VBG_KERNEL_REQUEST );
787
814
gdev -> mem_balloon .change_req =
788
815
vbg_req_alloc (sizeof (* gdev -> mem_balloon .change_req ),
789
- VMMDEVREQ_CHANGE_MEMBALLOON );
816
+ VMMDEVREQ_CHANGE_MEMBALLOON ,
817
+ VBG_KERNEL_REQUEST );
790
818
gdev -> cancel_req =
791
819
vbg_req_alloc (sizeof (* (gdev -> cancel_req )),
792
- VMMDEVREQ_HGCM_CANCEL2 );
820
+ VMMDEVREQ_HGCM_CANCEL2 ,
821
+ VBG_KERNEL_REQUEST );
793
822
gdev -> ack_events_req =
794
823
vbg_req_alloc (sizeof (* gdev -> ack_events_req ),
795
- VMMDEVREQ_ACKNOWLEDGE_EVENTS );
824
+ VMMDEVREQ_ACKNOWLEDGE_EVENTS ,
825
+ VBG_KERNEL_REQUEST );
796
826
gdev -> mouse_status_req =
797
827
vbg_req_alloc (sizeof (* gdev -> mouse_status_req ),
798
- VMMDEVREQ_GET_MOUSE_STATUS );
828
+ VMMDEVREQ_GET_MOUSE_STATUS ,
829
+ VBG_KERNEL_REQUEST );
799
830
800
831
if (!gdev -> mem_balloon .get_req || !gdev -> mem_balloon .change_req ||
801
832
!gdev -> cancel_req || !gdev -> ack_events_req ||
@@ -892,9 +923,9 @@ void vbg_core_exit(struct vbg_dev *gdev)
892
923
* vboxguest_linux.c calls this when userspace opens the char-device.
893
924
* Return: A pointer to the new session or an ERR_PTR on error.
894
925
* @gdev: The Guest extension device.
895
- * @user : Set if this is a session for the vboxuser device.
926
+ * @requestor : VMMDEV_REQUESTOR_* flags
896
927
*/
897
- struct vbg_session * vbg_core_open_session (struct vbg_dev * gdev , bool user )
928
+ struct vbg_session * vbg_core_open_session (struct vbg_dev * gdev , u32 requestor )
898
929
{
899
930
struct vbg_session * session ;
900
931
@@ -903,7 +934,7 @@ struct vbg_session *vbg_core_open_session(struct vbg_dev *gdev, bool user)
903
934
return ERR_PTR (- ENOMEM );
904
935
905
936
session -> gdev = gdev ;
906
- session -> user_session = user ;
937
+ session -> requestor = requestor ;
907
938
908
939
return session ;
909
940
}
@@ -924,7 +955,9 @@ void vbg_core_close_session(struct vbg_session *session)
924
955
if (!session -> hgcm_client_ids [i ])
925
956
continue ;
926
957
927
- vbg_hgcm_disconnect (gdev , session -> hgcm_client_ids [i ], & rc );
958
+ /* requestor is kernel here, as we're cleaning up. */
959
+ vbg_hgcm_disconnect (gdev , VBG_KERNEL_REQUEST ,
960
+ session -> hgcm_client_ids [i ], & rc );
928
961
}
929
962
930
963
kfree (session );
@@ -1152,7 +1185,8 @@ static int vbg_req_allowed(struct vbg_dev *gdev, struct vbg_session *session,
1152
1185
return - EPERM ;
1153
1186
}
1154
1187
1155
- if (trusted_apps_only && session -> user_session ) {
1188
+ if (trusted_apps_only &&
1189
+ (session -> requestor & VMMDEV_REQUESTOR_USER_DEVICE )) {
1156
1190
vbg_err ("Denying userspace vmm call type %#08x through vboxuser device node\n" ,
1157
1191
req -> request_type );
1158
1192
return - EPERM ;
@@ -1209,8 +1243,8 @@ static int vbg_ioctl_hgcm_connect(struct vbg_dev *gdev,
1209
1243
if (i >= ARRAY_SIZE (session -> hgcm_client_ids ))
1210
1244
return - EMFILE ;
1211
1245
1212
- ret = vbg_hgcm_connect (gdev , & conn -> u .in .loc , & client_id ,
1213
- & conn -> hdr .rc );
1246
+ ret = vbg_hgcm_connect (gdev , session -> requestor , & conn -> u .in .loc ,
1247
+ & client_id , & conn -> hdr .rc );
1214
1248
1215
1249
mutex_lock (& gdev -> session_mutex );
1216
1250
if (ret == 0 && conn -> hdr .rc >= 0 ) {
@@ -1251,7 +1285,8 @@ static int vbg_ioctl_hgcm_disconnect(struct vbg_dev *gdev,
1251
1285
if (i >= ARRAY_SIZE (session -> hgcm_client_ids ))
1252
1286
return - EINVAL ;
1253
1287
1254
- ret = vbg_hgcm_disconnect (gdev , client_id , & disconn -> hdr .rc );
1288
+ ret = vbg_hgcm_disconnect (gdev , session -> requestor , client_id ,
1289
+ & disconn -> hdr .rc );
1255
1290
1256
1291
mutex_lock (& gdev -> session_mutex );
1257
1292
if (ret == 0 && disconn -> hdr .rc >= 0 )
@@ -1313,12 +1348,12 @@ static int vbg_ioctl_hgcm_call(struct vbg_dev *gdev,
1313
1348
}
1314
1349
1315
1350
if (IS_ENABLED (CONFIG_COMPAT ) && f32bit )
1316
- ret = vbg_hgcm_call32 (gdev , client_id ,
1351
+ ret = vbg_hgcm_call32 (gdev , session -> requestor , client_id ,
1317
1352
call -> function , call -> timeout_ms ,
1318
1353
VBG_IOCTL_HGCM_CALL_PARMS32 (call ),
1319
1354
call -> parm_count , & call -> hdr .rc );
1320
1355
else
1321
- ret = vbg_hgcm_call (gdev , client_id ,
1356
+ ret = vbg_hgcm_call (gdev , session -> requestor , client_id ,
1322
1357
call -> function , call -> timeout_ms ,
1323
1358
VBG_IOCTL_HGCM_CALL_PARMS (call ),
1324
1359
call -> parm_count , & call -> hdr .rc );
@@ -1408,14 +1443,16 @@ static int vbg_ioctl_check_balloon(struct vbg_dev *gdev,
1408
1443
}
1409
1444
1410
1445
static int vbg_ioctl_write_core_dump (struct vbg_dev * gdev ,
1446
+ struct vbg_session * session ,
1411
1447
struct vbg_ioctl_write_coredump * dump )
1412
1448
{
1413
1449
struct vmmdev_write_core_dump * req ;
1414
1450
1415
1451
if (vbg_ioctl_chk (& dump -> hdr , sizeof (dump -> u .in ), 0 ))
1416
1452
return - EINVAL ;
1417
1453
1418
- req = vbg_req_alloc (sizeof (* req ), VMMDEVREQ_WRITE_COREDUMP );
1454
+ req = vbg_req_alloc (sizeof (* req ), VMMDEVREQ_WRITE_COREDUMP ,
1455
+ session -> requestor );
1419
1456
if (!req )
1420
1457
return - ENOMEM ;
1421
1458
@@ -1476,7 +1513,7 @@ int vbg_core_ioctl(struct vbg_session *session, unsigned int req, void *data)
1476
1513
case VBG_IOCTL_CHECK_BALLOON :
1477
1514
return vbg_ioctl_check_balloon (gdev , data );
1478
1515
case VBG_IOCTL_WRITE_CORE_DUMP :
1479
- return vbg_ioctl_write_core_dump (gdev , data );
1516
+ return vbg_ioctl_write_core_dump (gdev , session , data );
1480
1517
}
1481
1518
1482
1519
/* Variable sized requests. */
@@ -1508,7 +1545,8 @@ int vbg_core_set_mouse_status(struct vbg_dev *gdev, u32 features)
1508
1545
struct vmmdev_mouse_status * req ;
1509
1546
int rc ;
1510
1547
1511
- req = vbg_req_alloc (sizeof (* req ), VMMDEVREQ_SET_MOUSE_STATUS );
1548
+ req = vbg_req_alloc (sizeof (* req ), VMMDEVREQ_SET_MOUSE_STATUS ,
1549
+ VBG_KERNEL_REQUEST );
1512
1550
if (!req )
1513
1551
return - ENOMEM ;
1514
1552
0 commit comments