[PATCH] mount: fix undefined behavior in bit shift for MS_NOUSER
From: Gaosheng Cui
Date: Mon Oct 31 2022 - 07:39:56 EST
Shifting signed 32-bit value by 31 bits is undefined, so changing
significant bit to unsigned. The UBSAN warning calltrace like below:
UBSAN: shift-out-of-bounds in fs/namespace.c:3309:14
left shift of 1 by 31 places cannot be represented in type 'int'
Call Trace:
<TASK>
dump_stack_lvl+0x7d/0xa5
dump_stack+0x15/0x1b
ubsan_epilogue+0xe/0x4e
__ubsan_handle_shift_out_of_bounds+0x1e7/0x20c
path_mount+0x93/0xd50
init_mount+0x6a/0xa3
devtmpfs_setup+0x47/0x7e
devtmpfsd+0x1a/0x50
kthread+0x126/0x160
ret_from_fork+0x1f/0x30
</TASK>
Fixes: e262e32d6bde ("vfs: Suppress MS_* flag defs within the kernel unless explicitly enabled")
Signed-off-by: Gaosheng Cui <cuigaosheng1@xxxxxxxxxx>
---
include/uapi/linux/mount.h | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/include/uapi/linux/mount.h b/include/uapi/linux/mount.h
index 4d93967f8aea..035de4bd968f 100644
--- a/include/uapi/linux/mount.h
+++ b/include/uapi/linux/mount.h
@@ -44,7 +44,7 @@
#define MS_NOSEC (1<<28)
#define MS_BORN (1<<29)
#define MS_ACTIVE (1<<30)
-#define MS_NOUSER (1<<31)
+#define MS_NOUSER (1U<<31)
/*
* Superblock flags that can be altered by MS_REMOUNT
--
2.25.1