ext4: avoid utf8_strncasecmp() with unstable name
authorEric Biggers <ebiggers@google.com>
Mon, 1 Jun 2020 20:05:43 +0000 (13:05 -0700)
committerTheodore Ts'o <tytso@mit.edu>
Thu, 11 Jun 2020 15:01:33 +0000 (11:01 -0400)
commit2ce3ee931a097e9720310db3f09c01c825a4580c
treef93243da30740ae8c8f4c2d49ddcd2d39f49a60e
parent5adaccac46ea79008d7b75f47913f1a00f91d0ce
ext4: avoid utf8_strncasecmp() with unstable name

If the dentry name passed to ->d_compare() fits in dentry::d_iname, then
it may be concurrently modified by a rename.  This can cause undefined
behavior (possibly out-of-bounds memory accesses or crashes) in
utf8_strncasecmp(), since fs/unicode/ isn't written to handle strings
that may be concurrently modified.

Fix this by first copying the filename to a stack buffer if needed.
This way we get a stable snapshot of the filename.

Fixes: b886ee3e778e ("ext4: Support case-insensitive file name lookups")
Cc: <stable@vger.kernel.org> # v5.2+
Cc: Al Viro <viro@zeniv.linux.org.uk>
Cc: Daniel Rosenberg <drosen@google.com>
Cc: Gabriel Krisman Bertazi <krisman@collabora.co.uk>
Signed-off-by: Eric Biggers <ebiggers@google.com>
Reviewed-by: Andreas Dilger <adilger@dilger.ca>
Link: https://lore.kernel.org/r/20200601200543.59417-1-ebiggers@kernel.org
Signed-off-by: Theodore Ts'o <tytso@mit.edu>
fs/ext4/dir.c