summarylogtreecommitdiffstats
diff options
context:
space:
mode:
authorJean-Marc Lenoir2023-03-19 14:25:20 +0100
committerJean-Marc Lenoir2023-03-19 14:25:20 +0100
commitcfd85f6ffad9af2f56901e3310862043dcd8f832 (patch)
tree1a52e030f488084f787c936d67be95debcbb1e7c
parentf130a3178cafb79fc301dc7b267091ce4a74b9f4 (diff)
downloadaur-cfd85f6ffad9af2f56901e3310862043dcd8f832.tar.gz
Fix a potential crash when loading vmnet module
Fix compilation with Linux 6.3-rc2
-rw-r--r--.SRCINFO6
-rw-r--r--PKGBUILD6
-rw-r--r--vmmon.patch12
-rw-r--r--vmnet.patch138
4 files changed, 156 insertions, 6 deletions
diff --git a/.SRCINFO b/.SRCINFO
index 166160337510..bdb79f140fc3 100644
--- a/.SRCINFO
+++ b/.SRCINFO
@@ -1,7 +1,7 @@
pkgbase = vmware-workstation14
pkgdesc = The industry standard for running multiple operating systems as virtual machines on a single Linux PC.
pkgver = 14.1.7
- pkgrel = 20
+ pkgrel = 21
url = https://www.vmware.com/products/workstation-for-linux.html
install = vmware-workstation.install
arch = x86_64
@@ -88,7 +88,7 @@ pkgbase = vmware-workstation14
sha256sums = fe1b1be8297f4170406f97dd1f8b385d911faf45afe19cbc0c26b8092b3ddf8d
sha256sums = 10562d11d50edab9abc2b29c8948714edcb9b084f99b3766d07ddd21259e372e
sha256sums = 273d4357599a3e54259c78cc49054fef8ecfd2c2eda35cbcde3a53a62777a5ac
- sha256sums = b8ed84e5e33b4f856f1f4ad2a55de3e551a2db4e20b4f25c61d85e2dba0bdf64
- sha256sums = fca821216582060e4e05d7e10dd3ad5c8ca0f575a9060e8369a8331a2968e707
+ sha256sums = ee4a229c9f442dac34704526590c98eb2f1855eedab5e4cf3c153020dc0fe6e6
+ sha256sums = 59e8448ede5804e6f341edc8d28200c9d50d53fc19559a7b2d495cb51a46ecb8
pkgname = vmware-workstation14
diff --git a/PKGBUILD b/PKGBUILD
index 527989eff6cb..7b73ea164f4e 100644
--- a/PKGBUILD
+++ b/PKGBUILD
@@ -16,7 +16,7 @@ pkgname=vmware-workstation14
pkgver=14.1.7
_buildver=12989993
_pkgver=${pkgver}_${_buildver}
-pkgrel=20
+pkgrel=21
pkgdesc='The industry standard for running multiple operating systems as virtual machines on a single Linux PC.'
arch=(x86_64)
url='https://www.vmware.com/products/workstation-for-linux.html'
@@ -125,8 +125,8 @@ sha256sums=(
'10562d11d50edab9abc2b29c8948714edcb9b084f99b3766d07ddd21259e372e'
'273d4357599a3e54259c78cc49054fef8ecfd2c2eda35cbcde3a53a62777a5ac'
- 'b8ed84e5e33b4f856f1f4ad2a55de3e551a2db4e20b4f25c61d85e2dba0bdf64'
- 'fca821216582060e4e05d7e10dd3ad5c8ca0f575a9060e8369a8331a2968e707'
+ 'ee4a229c9f442dac34704526590c98eb2f1855eedab5e4cf3c153020dc0fe6e6'
+ '59e8448ede5804e6f341edc8d28200c9d50d53fc19559a7b2d495cb51a46ecb8'
)
options=(!strip emptydirs)
diff --git a/vmmon.patch b/vmmon.patch
index 9dbfd6d58eee..2b8f15a4fc65 100644
--- a/vmmon.patch
+++ b/vmmon.patch
@@ -62,6 +62,18 @@
#if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 11, 0)
LinuxDriverFault(struct vm_fault *fault) //IN/OUT
#else
+@@ -761,7 +768,11 @@ LinuxDriverMmap(struct file *filp,
+ return err;
+ }
+ /* Clear VM_IO, otherwise SuSE's kernels refuse to do get_user_pages */
++#if COMPAT_LINUX_VERSION_CHECK_LT(6, 3, 0)
+ vma->vm_flags &= ~VM_IO;
++#else
++ vm_flags_clear(vma, VM_IO);
++#endif
+
+ return 0;
+ }
--- a/vmmon/linux/hostif.c
+++ a/vmmon/linux/hostif.c
@@ -47,6 +47,8 @@
diff --git a/vmnet.patch b/vmnet.patch
index ccedc64c39fb..9e5d387ad4f4 100644
--- a/vmnet.patch
+++ b/vmnet.patch
@@ -383,3 +383,141 @@
}
e = e->nextEvent;
}
+From 650fb3abeb82f2b7d3a14f9579a7529d153636b7 Mon Sep 17 00:00:00 2001
+From: Michal Kubecek <mkubecek@suse.cz>
+Date: Fri, 7 Oct 2022 12:56:44 +0200
+Subject: [PATCH] vmnet: work around field-spanning write warning (#195)
+
+While VMware 17.0.1 did work around the field-spanning write warning in
+VNetEvent_Send() by wrapping struct VNet_EventHeader into a union, they
+neglected to handle the same problem in VNetUserListenerEventHandler() so
+that running 17.0.1 on kernel >= 6.1-rc1 still issues
+
+ memcpy: detected field-spanning write (size 28) of single field "&t->event"
+
+only this time it happens on VM start rather than on module load. Apply the
+same workaround as in 17.0.0 branch to avoid the warning.
+---
+ vmnet-only/vnet.h | 8 ++++++++
+ vmnet-only/vnetEvent.c | 2 +-
+ vmnet-only/vnetUserListener.c | 2 +-
+ 3 files changed, 10 insertions(+), 2 deletions(-)
+
+diff --git a/vmnet-only/vnet.h b/vmnet-only/vnet.h
+index d6691d5c..d5bb5572 100644
+--- a/vmnet-only/vnet.h
++++ b/vmnet-only/vnet.h
+@@ -274,6 +274,7 @@ typedef struct VNet_EventHeader {
+ uint32 eventId;
+ uint32 classSet;
+ uint32 type;
++ char payload[];
+ } VNet_EventHeader;
+ #pragma pack(pop)
+
+@@ -291,6 +292,13 @@ typedef struct VNet_LinkStateEvent {
+ } VNet_LinkStateEvent;
+ #pragma pack(pop)
+
++static inline void VNet_Event_copy(VNet_EventHeader *dst,
++ const VNet_EventHeader *src)
++{
++ *dst = *src;
++ memcpy(dst->payload, src->payload, src->size - sizeof(*src));
++}
++
+ /*
+ *----------------------------------------------------------------------------
+ */
+diff --git a/vmnet-only/vnetEvent.c b/vmnet-only/vnetEvent.c
+index f1579292..12036070 100644
+--- a/vmnet-only/vnetEvent.c
++++ b/vmnet-only/vnetEvent.c
+@@ -401,7 +401,7 @@ VNetEvent_Send(VNetEvent_Sender *s, // IN: a sender
+ p->nextEvent = s->firstEvent;
+ s->firstEvent = p;
+ }
+- memcpy(&p->event, e, e->size);
++ VNet_Event_copy(&p->event.header, e);
+
+ /* send event */
+ classSet = e->classSet;
+diff --git a/vmnet-only/vnetUserListener.c b/vmnet-only/vnetUserListener.c
+index 114f3907..e9f51755 100644
+--- a/vmnet-only/vnetUserListener.c
++++ b/vmnet-only/vnetUserListener.c
+@@ -226,7 +226,7 @@ VNetUserListenerEventHandler(void *context, // IN: the user listener
+ return;
+ }
+ t->nextEvent = NULL;
+- memcpy(&t->event, e, e->size);
++ VNet_Event_copy(&t->event, e);
+
+ /* append event to event list */
+ userListener = (VNetUserListener*)context;
+From 0ca979d4bd06144204d720bb82f0a1e29024f9fa Mon Sep 17 00:00:00 2001
+From: Michal Kubecek <mkubecek@suse.cz>
+Date: Wed, 18 Jan 2023 00:19:52 +0100
+Subject: [PATCH] vmnet: use explicit module_init() and module_exit() (#187)
+
+While vmmon module already uses explicit module_init() and module_exit()
+for its init and cleanup function, vmnet relies on traditional magic names
+init_module() and cleanup_module(). Apparently this has an unfortunate side
+effect that the two functions are not identified as indirect call targets
+by objdump and they get "sealed" when the module is built against and
+loaded into an IBT enabled kernel.
+
+Starting with 6.3-rc1, objtool is going to warn about this issue,
+indicating that the legacy module initialization is deprecated and
+module_init() and module_exit() macros should be used instead so do that
+for vmnet as well.
+---
+ vmnet-only/driver.c | 10 ++++++----
+ 1 file changed, 6 insertions(+), 4 deletions(-)
+
+diff --git a/vmnet-only/driver.c b/vmnet-only/driver.c
+index 197a213..b22cbfb 100644
+--- a/vmnet-only/driver.c
++++ b/vmnet-only/driver.c
+@@ -279,7 +279,7 @@ VNetRemovePortFromList(const VNetPort *port) // IN: port to remove from list
+ /*
+ *----------------------------------------------------------------------
+ *
+- * init_module --
++ * vmnet_init_module --
+ *
+ * linux module entry point. Called by /sbin/insmod command.
+ * Initializes module and Registers this driver for a
+@@ -296,7 +296,7 @@ VNetRemovePortFromList(const VNetPort *port) // IN: port to remove from list
+ */
+
+ int
+-init_module(void)
++vmnet_init_module(void)
+ {
+ int retval;
+
+@@ -358,7 +358,7 @@ init_module(void)
+ /*
+ *----------------------------------------------------------------------
+ *
+- * cleanup_module --
++ * vmnet_cleanup_module --
+ *
+ * Called by /sbin/rmmod. Unregisters this driver for a
+ * vnet major #, and deinitializes the modules. The 64-bit
+@@ -375,7 +375,7 @@ init_module(void)
+ */
+
+ void
+-cleanup_module(void)
++vmnet_cleanup_module(void)
+ {
+ unregister_chrdev(VNET_MAJOR_NUMBER, "vmnet");
+ VNetProtoUnregister();
+@@ -1701,3 +1701,5 @@ MODULE_LICENSE("GPL v2");
+ * by default (i.e., neither mkinitrd nor modprobe will accept it).
+ */
+ MODULE_INFO(supported, "external");
++module_init(vmnet_init_module);
++module_exit(vmnet_cleanup_module);