diff options
Diffstat (limited to 'fs/xfs/xfs_vnodeops.c')
| -rw-r--r-- | fs/xfs/xfs_vnodeops.c | 14 | 
1 files changed, 10 insertions, 4 deletions
diff --git a/fs/xfs/xfs_vnodeops.c b/fs/xfs/xfs_vnodeops.c index 4ecf2a54906..ce9268a2f56 100644 --- a/fs/xfs/xfs_vnodeops.c +++ b/fs/xfs/xfs_vnodeops.c @@ -112,7 +112,7 @@ xfs_readlink(  	char		*link)  {  	xfs_mount_t	*mp = ip->i_mount; -	int		pathlen; +	xfs_fsize_t	pathlen;  	int		error = 0;  	trace_xfs_readlink(ip); @@ -122,13 +122,19 @@ xfs_readlink(  	xfs_ilock(ip, XFS_ILOCK_SHARED); -	ASSERT(S_ISLNK(ip->i_d.di_mode)); -	ASSERT(ip->i_d.di_size <= MAXPATHLEN); -  	pathlen = ip->i_d.di_size;  	if (!pathlen)  		goto out; +	if (pathlen < 0 || pathlen > MAXPATHLEN) { +		xfs_alert(mp, "%s: inode (%llu) bad symlink length (%lld)", +			 __func__, (unsigned long long) ip->i_ino, +			 (long long) pathlen); +		ASSERT(0); +		return XFS_ERROR(EFSCORRUPTED); +	} + +  	if (ip->i_df.if_flags & XFS_IFINLINE) {  		memcpy(link, ip->i_df.if_u1.if_data, pathlen);  		link[pathlen] = '\0';  |