Skip to content
Browse files

virtualbox: Support UIDGID_STRICT_TYPE_CHECKS.

This adds a patch to support CONFIG_UIDGID_STRICT_TYPE_CHECKS being activated in
the kernel config (selected by CONFIG_USER_NS for example).

When this kernel option is enabled, current->cred->uid is a structure rather
than a simple integer type (uid_t and gid_t), so we need to check for that and
also pass the current user namespace where needed.

Signed-off-by: aszlig <aszlig@redmoonstudios.org>
  • Loading branch information...
1 parent f26b5fb commit 1029ca5767e3d27fbfbeb19a845ffee3485c028f @aszlig aszlig committed Mar 1, 2013
View
5 pkgs/applications/virtualization/virtualbox/default.nix
@@ -54,7 +54,10 @@ in stdenv.mkDerivation {
++ optional javaBindings jdk
++ optional pythonBindings python;
- patches = singleton ./missing_files_4.2.8.patch;
+ patches = [
+ ./missing_files_4.2.8.patch
+ ./strict_types.patch
+ ];
prePatch = ''
set -x
View
68 pkgs/applications/virtualization/virtualbox/strict_types.patch
@@ -0,0 +1,68 @@
+diff --git a/src/VBox/HostDrivers/Support/linux/SUPDrv-linux.c b/src/VBox/HostDrivers/Support/linux/SUPDrv-linux.c
+index 9cc124c..d86da0c 100644
+--- a/src/VBox/HostDrivers/Support/linux/SUPDrv-linux.c
++++ b/src/VBox/HostDrivers/Support/linux/SUPDrv-linux.c
+@@ -253,7 +253,11 @@ static struct platform_device gPlatformDevice =
+ DECLINLINE(RTUID) vboxdrvLinuxUid(void)
+ {
+ #if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 29)
++# ifdef CONFIG_UIDGID_STRICT_TYPE_CHECKS
++ return from_kuid(current_user_ns(), current_uid());
++# else
+ return current->cred->uid;
++# endif
+ #else
+ return current->uid;
+ #endif
+@@ -262,7 +266,11 @@ DECLINLINE(RTUID) vboxdrvLinuxUid(void)
+ DECLINLINE(RTGID) vboxdrvLinuxGid(void)
+ {
+ #if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 29)
++# ifdef CONFIG_UIDGID_STRICT_TYPE_CHECKS
++ return from_kgid(current_user_ns(), current_gid());
++# else
+ return current->cred->gid;
++# endif
+ #else
+ return current->gid;
+ #endif
+@@ -271,7 +279,11 @@ DECLINLINE(RTGID) vboxdrvLinuxGid(void)
+ DECLINLINE(RTUID) vboxdrvLinuxEuid(void)
+ {
+ #if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 29)
++# ifdef CONFIG_UIDGID_STRICT_TYPE_CHECKS
++ return from_kuid(current_user_ns(), current_euid());
++# else
+ return current->cred->euid;
++# endif
+ #else
+ return current->euid;
+ #endif
+diff --git a/src/VBox/HostDrivers/VBoxPci/linux/VBoxPci-linux.c b/src/VBox/HostDrivers/VBoxPci/linux/VBoxPci-linux.c
+index 575f739..8909e79 100644
+--- a/src/VBox/HostDrivers/VBoxPci/linux/VBoxPci-linux.c
++++ b/src/VBox/HostDrivers/VBoxPci/linux/VBoxPci-linux.c
+@@ -429,7 +429,11 @@ int vboxPciOsDevDetachHostDriver(PVBOXRAWPCIINS pIns)
+ if (!pNewCreds)
+ goto done;
+
++# ifdef CONFIG_UIDGID_STRICT_TYPE_CHECKS
++ pNewCreds->fsuid = GLOBAL_ROOT_UID;;
++# else
+ pNewCreds->fsuid = 0;
++# endif
+ pOldCreds = override_creds(pNewCreds);
+ #endif
+
+@@ -539,7 +543,11 @@ int vboxPciOsDevReattachHostDriver(PVBOXRAWPCIINS pIns)
+ if (!pNewCreds)
+ goto done;
+
++# ifdef CONFIG_UIDGID_STRICT_TYPE_CHECKS
++ pNewCreds->fsuid = GLOBAL_ROOT_UID;;
++# else
+ pNewCreds->fsuid = 0;
++# endif
+ pOldCreds = override_creds(pNewCreds);
+ #endif
+ RTStrPrintf(szFileBuf, cMaxBuf,

0 comments on commit 1029ca5

Please sign in to comment.
Something went wrong with that request. Please try again.