diff options
author | Linus Torvalds <torvalds@linux-foundation.org> | 2020-01-23 10:05:05 -0800 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2020-01-23 10:05:05 -0800 |
commit | 2c6b7bcd747201441923a0d3062577a8d1fbd8f8 (patch) | |
tree | 8c8c596e7329bc7cd332ab80d3398633d0340612 /fs/readdir.c | |
parent | 131701c697e85d5d0726e6152219359639fae98f (diff) | |
download | linux-stable-2c6b7bcd747201441923a0d3062577a8d1fbd8f8.tar.gz linux-stable-2c6b7bcd747201441923a0d3062577a8d1fbd8f8.tar.bz2 linux-stable-2c6b7bcd747201441923a0d3062577a8d1fbd8f8.zip |
readdir: be more conservative with directory entry names
Commit 8a23eb804ca4 ("Make filldir[64]() verify the directory entry
filename is valid") added some minimal validity checks on the directory
entries passed to filldir[64](). But they really were pretty minimal.
This fleshes out at least the name length check: we used to disallow
zero-length names, but really, negative lengths or oevr-long names
aren't ok either. Both could happen if there is some filesystem
corruption going on.
Now, most filesystems tend to use just an "unsigned char" or similar for
the length of a directory entry name, so even with a corrupt filesystem
you should never see anything odd like that. But since we then use the
name length to create the directory entry record length, let's make sure
it actually is half-way sensible.
Note how POSIX states that the size of a path component is limited by
NAME_MAX, but we actually use PATH_MAX for the check here. That's
because while NAME_MAX is generally the correct maximum name length
(it's 255, for the same old "name length is usually just a byte on
disk"), there's nothing in the VFS layer that really cares.
So the real limitation at a VFS layer is the total pathname length you
can pass as a filename: PATH_MAX.
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Diffstat (limited to 'fs/readdir.c')
-rw-r--r-- | fs/readdir.c | 6 |
1 files changed, 5 insertions, 1 deletions
diff --git a/fs/readdir.c b/fs/readdir.c index d26d5ea4de7b..03eedaf36134 100644 --- a/fs/readdir.c +++ b/fs/readdir.c @@ -102,10 +102,14 @@ EXPORT_SYMBOL(iterate_dir); * filename length, and the above "soft error" worry means * that it's probably better left alone until we have that * issue clarified. + * + * Note the PATH_MAX check - it's arbitrary but the real + * kernel limit on a possible path component, not NAME_MAX, + * which is the technical standard limit. */ static int verify_dirent_name(const char *name, int len) { - if (!len) + if (len <= 0 || len >= PATH_MAX) return -EIO; if (memchr(name, '/', len)) return -EIO; |