Commit 16cede18 authored by Andreas Gruenbacher's avatar Andreas Gruenbacher Committed by sanglipeng
Browse files

gfs2: Switch from strlcpy to strscpy

stable inclusion
from stable-v5.10.156
commit a5da76df467a55071c88c7e2612250e91034e4d7
category: bugfix
bugzilla: https://gitee.com/openeuler/kernel/issues/I7MCG1

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



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

commit 204c0300 upstream.

Switch from strlcpy to strscpy and make sure that @count is the size of
the smaller of the source and destination buffers.  This prevents
reading beyond the end of the source buffer when the source string isn't
null terminated.

Found by a modified version of syzkaller.

Suggested-by: default avatarWolfram Sang <wsa+renesas@sang-engineering.com>
Signed-off-by: default avatarAndreas Gruenbacher <agruenba@redhat.com>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Signed-off-by: default avatarsanglipeng <sanglipeng1@jd.com>
parent 71e74180
Loading
Loading
Loading
Loading
+7 −5
Original line number Diff line number Diff line
@@ -384,8 +384,10 @@ static int init_names(struct gfs2_sbd *sdp, int silent)
	if (!table[0])
		table = sdp->sd_vfs->s_id;

	strlcpy(sdp->sd_proto_name, proto, GFS2_FSNAME_LEN);
	strlcpy(sdp->sd_table_name, table, GFS2_FSNAME_LEN);
	BUILD_BUG_ON(GFS2_LOCKNAME_LEN > GFS2_FSNAME_LEN);

	strscpy(sdp->sd_proto_name, proto, GFS2_LOCKNAME_LEN);
	strscpy(sdp->sd_table_name, table, GFS2_LOCKNAME_LEN);

	table = sdp->sd_table_name;
	while ((table = strchr(table, '/')))
@@ -1417,13 +1419,13 @@ static int gfs2_parse_param(struct fs_context *fc, struct fs_parameter *param)

	switch (o) {
	case Opt_lockproto:
		strlcpy(args->ar_lockproto, param->string, GFS2_LOCKNAME_LEN);
		strscpy(args->ar_lockproto, param->string, GFS2_LOCKNAME_LEN);
		break;
	case Opt_locktable:
		strlcpy(args->ar_locktable, param->string, GFS2_LOCKNAME_LEN);
		strscpy(args->ar_locktable, param->string, GFS2_LOCKNAME_LEN);
		break;
	case Opt_hostdata:
		strlcpy(args->ar_hostdata, param->string, GFS2_LOCKNAME_LEN);
		strscpy(args->ar_hostdata, param->string, GFS2_LOCKNAME_LEN);
		break;
	case Opt_spectator:
		args->ar_spectator = 1;