diff options
Diffstat (limited to 'fs/ocfs2/super.c')
| -rw-r--r-- | fs/ocfs2/super.c | 14 | 
1 files changed, 10 insertions, 4 deletions
| diff --git a/fs/ocfs2/super.c b/fs/ocfs2/super.c index c86bd4e60e20..5c914ce9b3ac 100644 --- a/fs/ocfs2/super.c +++ b/fs/ocfs2/super.c @@ -2167,11 +2167,17 @@ static int ocfs2_initialize_super(struct super_block *sb,  	}  	if (ocfs2_clusterinfo_valid(osb)) { +		/* +		 * ci_stack and ci_cluster in ocfs2_cluster_info may not be null +		 * terminated, so make sure no overflow happens here by using +		 * memcpy. Destination strings will always be null terminated +		 * because osb is allocated using kzalloc. +		 */  		osb->osb_stackflags =  			OCFS2_RAW_SB(di)->s_cluster_info.ci_stackflags; -		strlcpy(osb->osb_cluster_stack, +		memcpy(osb->osb_cluster_stack,  		       OCFS2_RAW_SB(di)->s_cluster_info.ci_stack, -		       OCFS2_STACK_LABEL_LEN + 1); +		       OCFS2_STACK_LABEL_LEN);  		if (strlen(osb->osb_cluster_stack) != OCFS2_STACK_LABEL_LEN) {  			mlog(ML_ERROR,  			     "couldn't mount because of an invalid " @@ -2180,9 +2186,9 @@ static int ocfs2_initialize_super(struct super_block *sb,  			status = -EINVAL;  			goto bail;  		} -		strlcpy(osb->osb_cluster_name, +		memcpy(osb->osb_cluster_name,  			OCFS2_RAW_SB(di)->s_cluster_info.ci_cluster, -			OCFS2_CLUSTER_NAME_LEN + 1); +			OCFS2_CLUSTER_NAME_LEN);  	} else {  		/* The empty string is identical with classic tools that  		 * don't know about s_cluster_info. */ |