1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
|
--- a/vmnet/Makefile
+++ b/vmnet/Makefile
@@ -43,7 +43,11 @@ INCLUDE += -I$(SRCROOT)/shared
endif
+ifdef KVERSION
+VM_UNAME = $(KVERSION)
+else
VM_UNAME = $(shell uname -r)
+endif
# Header directory for the running kernel
ifdef LINUXINCLUDE
@@ -98,6 +98,13 @@ auto-build: $(DRIVER_KO)
$(DRIVER): $(DRIVER_KO)
if [ $< -nt $@ ] || [ ! -e $@ ] ; then cp -f $< $@; fi
+# Use SUBDIRS on 2.x, 3.x, 4.x. Use M on newer kernels.
+ifeq ($(filter-out 2 3 4,$(firstword $(subst ., ,$(VM_UNAME)))),)
+DIRVAR := SUBDIRS
+else
+DIRVAR := M
+endif
+
#
# Define a setup target that gets built before the actual driver.
# This target may not be used at all, but if it is then it will be defined
@@ -107,7 +114,7 @@ prebuild:: ;
postbuild:: ;
$(DRIVER_KO): prebuild
- $(MAKE) -C $(BUILD_DIR) SUBDIRS=$$PWD SRCROOT=$$PWD/$(SRCROOT) \
+ $(MAKE) -C $(BUILD_DIR) $(DIRVAR)=$$PWD SRCROOT=$$PWD/$(SRCROOT) \
MODULEBUILDDIR=$(MODULEBUILDDIR) modules
$(MAKE) -C $$PWD SRCROOT=$$PWD/$(SRCROOT) \
MODULEBUILDDIR=$(MODULEBUILDDIR) postbuild
--- a/vmnet/userif.c
+++ b/vmnet/userif.c
@@ -137,16 +137,21 @@
*/
static INLINE int
-VNetUserIfMapPtr(VA uAddr, // IN: pointer to user memory
+VNetUserIfMapPtr(VA64 uAddr, // IN: pointer to user memory
size_t size, // IN: size of data
struct page **p, // OUT: locked page
void **ptr) // OUT: kernel mapped pointer
{
- if (!access_ok(VERIFY_WRITE, (void *)uAddr, size) ||
- (((uAddr + size - 1) & ~(PAGE_SIZE - 1)) !=
- (uAddr & ~(PAGE_SIZE - 1)))) {
+ uint8 v;
+
+ /* Check area does not straddle two pages. */
+ if ((uAddr & (PAGE_SIZE - 1)) + size > PAGE_SIZE) {
return -EINVAL;
}
+ /* Check if it is user's area. UserifLockPage() checks writability. */
+ if (copy_from_user(&v, (void *)(unsigned long)uAddr, sizeof v) != 0) {
+ return -EFAULT;
+ }
*p = UserifLockPage(uAddr);
if (*p == NULL) {
@@ -158,7 +163,7 @@
}
static INLINE int
-VNetUserIfMapUint32Ptr(VA uAddr, // IN: pointer to user memory
+VNetUserIfMapUint32Ptr(VA64 uAddr, // IN: pointer to user memory
struct page **p, // OUT: locked page
uint32 **ptr) // OUT: kernel mapped pointer
{
@@ -201,7 +206,7 @@
return -EBUSY;
}
- if ((retval = VNetUserIfMapUint32Ptr((VA)vn->pollPtr, &pollPage,
+ if ((retval = VNetUserIfMapUint32Ptr(vn->pollPtr, &pollPage,
&pollPtr)) < 0) {
return retval;
}
@@ -213,7 +218,7 @@
goto error_free;
}
- if ((retval = VNetUserIfMapUint32Ptr((VA)vn->recvClusterPtr,
+ if ((retval = VNetUserIfMapUint32Ptr(vn->recvClusterPtr,
&recvClusterPage,
&recvClusterCount)) < 0) {
goto error_free;
|