Commit 9b3b353e authored by Linus Torvalds's avatar Linus Torvalds

vboxfs: fix broken legacy mount signature checking

Commit 9d682ea6 ("vboxsf: Fix the check for the old binary
mount-arguments struct") was meant to fix a build error due to sign
mismatch in 'char' and the use of character constants, but it just moved
the error elsewhere, in that on some architectures characters and signed
and on others they are unsigned, and that's just how the C standard
works.

The proper fix is a simple "don't do that then".  The code was just
being silly and odd, and it should never have cared about signed vs
unsigned characters in the first place, since what it is testing is not
four "characters", but four bytes.

And the way to compare four bytes is by using "memcmp()".

Which compilers will know to just turn into a single 32-bit compare with
a constant, as long as you don't have crazy debug options enabled.

Link: https://lore.kernel.org/lkml/20210927094123.576521-1-arnd@kernel.org/
Cc: Arnd Bergmann <arnd@kernel.org>
Cc: Hans de Goede <hdegoede@redhat.com>
Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
parent 42d43c92
...@@ -21,10 +21,7 @@ ...@@ -21,10 +21,7 @@
#define VBOXSF_SUPER_MAGIC 0x786f4256 /* 'VBox' little endian */ #define VBOXSF_SUPER_MAGIC 0x786f4256 /* 'VBox' little endian */
#define VBSF_MOUNT_SIGNATURE_BYTE_0 ('\000') static const unsigned char VBSF_MOUNT_SIGNATURE[4] = "\000\377\376\375";
#define VBSF_MOUNT_SIGNATURE_BYTE_1 ('\377')
#define VBSF_MOUNT_SIGNATURE_BYTE_2 ('\376')
#define VBSF_MOUNT_SIGNATURE_BYTE_3 ('\375')
static int follow_symlinks; static int follow_symlinks;
module_param(follow_symlinks, int, 0444); module_param(follow_symlinks, int, 0444);
...@@ -386,12 +383,7 @@ static int vboxsf_setup(void) ...@@ -386,12 +383,7 @@ static int vboxsf_setup(void)
static int vboxsf_parse_monolithic(struct fs_context *fc, void *data) static int vboxsf_parse_monolithic(struct fs_context *fc, void *data)
{ {
unsigned char *options = data; if (data && !memcmp(data, VBSF_MOUNT_SIGNATURE, 4)) {
if (options && options[0] == VBSF_MOUNT_SIGNATURE_BYTE_0 &&
options[1] == VBSF_MOUNT_SIGNATURE_BYTE_1 &&
options[2] == VBSF_MOUNT_SIGNATURE_BYTE_2 &&
options[3] == VBSF_MOUNT_SIGNATURE_BYTE_3) {
vbg_err("vboxsf: Old binary mount data not supported, remove obsolete mount.vboxsf and/or update your VBoxService.\n"); vbg_err("vboxsf: Old binary mount data not supported, remove obsolete mount.vboxsf and/or update your VBoxService.\n");
return -EINVAL; return -EINVAL;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment