Commit f2de4164 authored by Al Viro's avatar Al Viro Committed by Wentao Guan
Browse files

hostfs: fix string handling in __dentry_name()

stable inclusion
from stable-v6.6.76
commit 86ec56b25476758f708328b2eeed68918567efd0
category: bugfix
bugzilla: https://gitee.com/openeuler/kernel/issues/IBW08Q

Reference: https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git/commit/?id=86ec56b25476758f708328b2eeed68918567efd0



--------------------------------

[ Upstream commit 60a6002432448bb3f291d80768ae98d62efc9c77 ]

strcpy() should not be used with destination potentially overlapping
the source; what's more, strscpy() in there is pointless - we already
know the amount we want to copy; might as well use memcpy().

Fixes: c278e81b "hostfs: Remove open coded strcpy()"
Signed-off-by: default avatarAl Viro <viro@zeniv.linux.org.uk>
Signed-off-by: default avatarSasha Levin <sashal@kernel.org>
(cherry picked from commit 86ec56b25476758f708328b2eeed68918567efd0)
Signed-off-by: default avatarWentao Guan <guanwentao@uniontech.com>
parent d1b6c95f
Loading
Loading
Loading
Loading
+6 −21
Original line number Diff line number Diff line
@@ -93,32 +93,17 @@ __uml_setup("hostfs=", hostfs_args,
static char *__dentry_name(struct dentry *dentry, char *name)
{
	char *p = dentry_path_raw(dentry, name, PATH_MAX);
	char *root;
	size_t len;
	struct hostfs_fs_info *fsi;

	fsi = dentry->d_sb->s_fs_info;
	root = fsi->host_root_path;
	len = strlen(root);
	if (IS_ERR(p)) {
		__putname(name);
		return NULL;
	}

	/*
	 * This function relies on the fact that dentry_path_raw() will place
	 * the path name at the end of the provided buffer.
	 */
	BUG_ON(p + strlen(p) + 1 != name + PATH_MAX);
	struct hostfs_fs_info *fsi = dentry->d_sb->s_fs_info;
	char *root = fsi->host_root_path;
	size_t len = strlen(root);

	strscpy(name, root, PATH_MAX);
	if (len > p - name) {
	if (IS_ERR(p) || len > p - name) {
		__putname(name);
		return NULL;
	}

	if (p > name + len)
		strcpy(name + len, p);
	memcpy(name, root, len);
	memmove(name + len, p, name + PATH_MAX - p);

	return name;
}