2022-10-31 11:56:50

by Gaosheng Cui

[permalink] [raw]
Subject: [PATCH] mount: fix undefined behavior in bit shift for MS_NOUSER

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 <[email protected]>
---
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