Commit 16f5cea7 authored by Warner Losh's avatar Warner Losh Committed by Paul E. McKenney
Browse files

tools/nolibc: Fix S_ISxxx macros



The mode field has the type encoded as an value in a field, not as a bit
mask. Mask the mode with S_IFMT instead of each type to test. Otherwise,
false positives are possible: eg S_ISDIR will return true for block
devices because S_IFDIR = 0040000 and S_IFBLK = 0060000 since mode is
masked with S_IFDIR instead of S_IFMT. These macros now match the
similar definitions in tools/include/uapi/linux/stat.h.

Signed-off-by: default avatarWarner Losh <imp@bsdimp.com>
Signed-off-by: default avatarWilly Tarreau <w@1wt.eu>
Signed-off-by: default avatarPaul E. McKenney <paulmck@kernel.org>
parent feaf7565
Loading
Loading
Loading
Loading
+7 −7
Original line number Diff line number Diff line
@@ -26,13 +26,13 @@
#define S_IFSOCK       0140000
#define S_IFMT         0170000

#define S_ISDIR(mode)  (((mode) & S_IFDIR)  == S_IFDIR)
#define S_ISCHR(mode)  (((mode) & S_IFCHR)  == S_IFCHR)
#define S_ISBLK(mode)  (((mode) & S_IFBLK)  == S_IFBLK)
#define S_ISREG(mode)  (((mode) & S_IFREG)  == S_IFREG)
#define S_ISFIFO(mode) (((mode) & S_IFIFO)  == S_IFIFO)
#define S_ISLNK(mode)  (((mode) & S_IFLNK)  == S_IFLNK)
#define S_ISSOCK(mode) (((mode) & S_IFSOCK) == S_IFSOCK)
#define S_ISDIR(mode)  (((mode) & S_IFMT) == S_IFDIR)
#define S_ISCHR(mode)  (((mode) & S_IFMT) == S_IFCHR)
#define S_ISBLK(mode)  (((mode) & S_IFMT) == S_IFBLK)
#define S_ISREG(mode)  (((mode) & S_IFMT) == S_IFREG)
#define S_ISFIFO(mode) (((mode) & S_IFMT) == S_IFIFO)
#define S_ISLNK(mode)  (((mode) & S_IFMT) == S_IFLNK)
#define S_ISSOCK(mode) (((mode) & S_IFMT) == S_IFSOCK)

/* dirent types */
#define DT_UNKNOWN     0x0