[XFS] don't leak m_fsname/m_rtname/m_logname
Add a helper to free the m_fsname/m_rtname/m_logname allocations and use it properly for all mount failure cases. Also switch the allocations for these to kstrdup while we're at it. SGI-PV: 981498 SGI-Modid: xfs-linux-melb:xfs-kern:31728a Signed-off-by: Christoph Hellwig <hch@infradead.org> Signed-off-by: Niv Sardi <xaiki@sgi.com> Signed-off-by: David Chinner <david@fromorbit.com> Signed-off-by: Lachlan McIlroy <lachlan@sgi.com>
This commit is contained in:
		
							parent
							
								
									5e9da7b7a1
								
							
						
					
					
						commit
						a738159df2
					
				| @ -1200,6 +1200,15 @@ xfssyncd( | ||||
| 	return 0; | ||||
| } | ||||
| 
 | ||||
| STATIC void | ||||
| xfs_free_fsname( | ||||
| 	struct xfs_mount	*mp) | ||||
| { | ||||
| 	kfree(mp->m_fsname); | ||||
| 	kfree(mp->m_rtname); | ||||
| 	kfree(mp->m_logname); | ||||
| } | ||||
| 
 | ||||
| STATIC void | ||||
| xfs_fs_put_super( | ||||
| 	struct super_block	*sb) | ||||
| @ -1261,6 +1270,7 @@ xfs_fs_put_super( | ||||
| 	xfs_close_devices(mp); | ||||
| 	xfs_qmops_put(mp); | ||||
| 	xfs_dmops_put(mp); | ||||
| 	xfs_free_fsname(mp); | ||||
| 	kfree(mp); | ||||
| } | ||||
| 
 | ||||
| @ -1517,6 +1527,8 @@ xfs_start_flags( | ||||
| 	struct xfs_mount_args	*ap, | ||||
| 	struct xfs_mount	*mp) | ||||
| { | ||||
| 	int			error; | ||||
| 
 | ||||
| 	/* Values are in BBs */ | ||||
| 	if ((ap->flags & XFSMNT_NOALIGN) != XFSMNT_NOALIGN) { | ||||
| 		/*
 | ||||
| @ -1549,17 +1561,27 @@ xfs_start_flags( | ||||
| 			ap->logbufsize); | ||||
| 		return XFS_ERROR(EINVAL); | ||||
| 	} | ||||
| 
 | ||||
| 	error = ENOMEM; | ||||
| 
 | ||||
| 	mp->m_logbsize = ap->logbufsize; | ||||
| 	mp->m_fsname_len = strlen(ap->fsname) + 1; | ||||
| 	mp->m_fsname = kmem_alloc(mp->m_fsname_len, KM_SLEEP); | ||||
| 	strcpy(mp->m_fsname, ap->fsname); | ||||
| 
 | ||||
| 	mp->m_fsname = kstrdup(ap->fsname, GFP_KERNEL); | ||||
| 	if (!mp->m_fsname) | ||||
| 		goto out; | ||||
| 
 | ||||
| 	if (ap->rtname[0]) { | ||||
| 		mp->m_rtname = kmem_alloc(strlen(ap->rtname) + 1, KM_SLEEP); | ||||
| 		strcpy(mp->m_rtname, ap->rtname); | ||||
| 		mp->m_rtname = kstrdup(ap->rtname, GFP_KERNEL); | ||||
| 		if (!mp->m_rtname) | ||||
| 			goto out_free_fsname; | ||||
| 
 | ||||
| 	} | ||||
| 
 | ||||
| 	if (ap->logname[0]) { | ||||
| 		mp->m_logname = kmem_alloc(strlen(ap->logname) + 1, KM_SLEEP); | ||||
| 		strcpy(mp->m_logname, ap->logname); | ||||
| 		mp->m_logname = kstrdup(ap->logname, GFP_KERNEL); | ||||
| 		if (!mp->m_logname) | ||||
| 			goto out_free_rtname; | ||||
| 	} | ||||
| 
 | ||||
| 	if (ap->flags & XFSMNT_WSYNC) | ||||
| @ -1632,6 +1654,14 @@ xfs_start_flags( | ||||
| 	if (ap->flags & XFSMNT_DMAPI) | ||||
| 		mp->m_flags |= XFS_MOUNT_DMAPI; | ||||
| 	return 0; | ||||
| 
 | ||||
| 
 | ||||
|  out_free_rtname: | ||||
| 	kfree(mp->m_rtname); | ||||
|  out_free_fsname: | ||||
| 	kfree(mp->m_fsname); | ||||
|  out: | ||||
| 	return error; | ||||
| } | ||||
| 
 | ||||
| /*
 | ||||
| @ -1792,10 +1822,10 @@ xfs_fs_fill_super( | ||||
| 	 */ | ||||
| 	error = xfs_start_flags(args, mp); | ||||
| 	if (error) | ||||
| 		goto out_destroy_counters; | ||||
| 		goto out_free_fsname; | ||||
| 	error = xfs_readsb(mp, flags); | ||||
| 	if (error) | ||||
| 		goto out_destroy_counters; | ||||
| 		goto out_free_fsname; | ||||
| 	error = xfs_finish_flags(args, mp); | ||||
| 	if (error) | ||||
| 		goto out_free_sb; | ||||
| @ -1857,7 +1887,8 @@ xfs_fs_fill_super( | ||||
| 	xfs_filestream_unmount(mp); | ||||
|  out_free_sb: | ||||
| 	xfs_freesb(mp); | ||||
|  out_destroy_counters: | ||||
|  out_free_fsname: | ||||
| 	xfs_free_fsname(mp); | ||||
| 	xfs_icsb_destroy_counters(mp); | ||||
| 	xfs_close_devices(mp); | ||||
|  out_put_qmops: | ||||
| @ -1893,7 +1924,7 @@ xfs_fs_fill_super( | ||||
| 	IRELE(mp->m_rootip); | ||||
| 
 | ||||
| 	xfs_unmountfs(mp); | ||||
| 	goto out_destroy_counters; | ||||
| 	goto out_free_fsname; | ||||
| } | ||||
| 
 | ||||
| STATIC int | ||||
|  | ||||
| @ -146,13 +146,6 @@ xfs_mount_free( | ||||
| 	mutex_destroy(&mp->m_growlock); | ||||
| 	if (mp->m_quotainfo) | ||||
| 		XFS_QM_DONE(mp); | ||||
| 
 | ||||
| 	if (mp->m_fsname != NULL) | ||||
| 		kmem_free(mp->m_fsname); | ||||
| 	if (mp->m_rtname != NULL) | ||||
| 		kmem_free(mp->m_rtname); | ||||
| 	if (mp->m_logname != NULL) | ||||
| 		kmem_free(mp->m_logname); | ||||
| } | ||||
| 
 | ||||
| /*
 | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user