diff options
author | Jean-Marc Lenoir | 2023-03-19 14:25:20 +0100 |
---|---|---|
committer | Jean-Marc Lenoir | 2023-03-19 14:25:20 +0100 |
commit | cfd85f6ffad9af2f56901e3310862043dcd8f832 (patch) | |
tree | 1a52e030f488084f787c936d67be95debcbb1e7c | |
parent | f130a3178cafb79fc301dc7b267091ce4a74b9f4 (diff) | |
download | aur-cfd85f6ffad9af2f56901e3310862043dcd8f832.tar.gz |
Fix a potential crash when loading vmnet module
Fix compilation with Linux 6.3-rc2
-rw-r--r-- | .SRCINFO | 6 | ||||
-rw-r--r-- | PKGBUILD | 6 | ||||
-rw-r--r-- | vmmon.patch | 12 | ||||
-rw-r--r-- | vmnet.patch | 138 |
4 files changed, 156 insertions, 6 deletions
@@ -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 @@ -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); |