public inbox for linux-xfs@vger.kernel.org
 help / color / mirror / Atom feed
* [PATCH 1/4] don't leak m_fsname/m_rtname/m_logname
@ 2008-05-25 19:07 Christoph Hellwig
  2008-07-21 12:18 ` Christoph Hellwig
  2008-07-21 22:59 ` Dave Chinner
  0 siblings, 2 replies; 3+ messages in thread
From: Christoph Hellwig @ 2008-05-25 19:07 UTC (permalink / raw)
  To: xfs

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.


Signed-off-by: Christoph Hellwig <hch@lst.de>

Index: linux-2.6-xfs/fs/xfs/linux-2.6/xfs_super.c
===================================================================
--- linux-2.6-xfs.orig/fs/xfs/linux-2.6/xfs_super.c	2008-05-22 19:30:25.000000000 +0200
+++ linux-2.6-xfs/fs/xfs/linux-2.6/xfs_super.c	2008-05-22 19:30:44.000000000 +0200
@@ -1079,6 +1079,15 @@ xfssyncd(
 }
 
 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)
 {
@@ -1139,6 +1148,7 @@ xfs_fs_put_super(
 	xfs_close_devices(mp);
 	xfs_qmops_put(mp);
 	xfs_dmops_put(mp);
+	xfs_free_fsname(mp);
 	kfree(mp);
 }
 
@@ -1408,6 +1418,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) {
 		/*
@@ -1440,17 +1452,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)
@@ -1523,6 +1545,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;
 }
 
 /*
@@ -1683,10 +1713,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;
@@ -1748,7 +1778,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:
@@ -1784,7 +1815,7 @@ xfs_fs_fill_super(
 	IRELE(mp->m_rootip);
 
 	xfs_unmountfs(mp);
-	goto out_destroy_counters;
+	goto out_free_fsname;
 }
 
 STATIC int
Index: linux-2.6-xfs/fs/xfs/xfs_mount.c
===================================================================
--- linux-2.6-xfs.orig/fs/xfs/xfs_mount.c	2008-05-22 19:31:25.000000000 +0200
+++ linux-2.6-xfs/fs/xfs/xfs_mount.c	2008-05-22 19:31:29.000000000 +0200
@@ -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);
 }
 
 /*

^ permalink raw reply	[flat|nested] 3+ messages in thread

* Re: [PATCH 1/4] don't leak m_fsname/m_rtname/m_logname
  2008-05-25 19:07 [PATCH 1/4] don't leak m_fsname/m_rtname/m_logname Christoph Hellwig
@ 2008-07-21 12:18 ` Christoph Hellwig
  2008-07-21 22:59 ` Dave Chinner
  1 sibling, 0 replies; 3+ messages in thread
From: Christoph Hellwig @ 2008-07-21 12:18 UTC (permalink / raw)
  To: xfs

On Sun, May 25, 2008 at 09:07:36PM +0200, Christoph Hellwig wrote:
> 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.

ping.

> 
> 
> Signed-off-by: Christoph Hellwig <hch@lst.de>
> 
> Index: linux-2.6-xfs/fs/xfs/linux-2.6/xfs_super.c
> ===================================================================
> --- linux-2.6-xfs.orig/fs/xfs/linux-2.6/xfs_super.c	2008-05-22 19:30:25.000000000 +0200
> +++ linux-2.6-xfs/fs/xfs/linux-2.6/xfs_super.c	2008-05-22 19:30:44.000000000 +0200
> @@ -1079,6 +1079,15 @@ xfssyncd(
>  }
>  
>  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)
>  {
> @@ -1139,6 +1148,7 @@ xfs_fs_put_super(
>  	xfs_close_devices(mp);
>  	xfs_qmops_put(mp);
>  	xfs_dmops_put(mp);
> +	xfs_free_fsname(mp);
>  	kfree(mp);
>  }
>  
> @@ -1408,6 +1418,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) {
>  		/*
> @@ -1440,17 +1452,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)
> @@ -1523,6 +1545,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;
>  }
>  
>  /*
> @@ -1683,10 +1713,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;
> @@ -1748,7 +1778,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:
> @@ -1784,7 +1815,7 @@ xfs_fs_fill_super(
>  	IRELE(mp->m_rootip);
>  
>  	xfs_unmountfs(mp);
> -	goto out_destroy_counters;
> +	goto out_free_fsname;
>  }
>  
>  STATIC int
> Index: linux-2.6-xfs/fs/xfs/xfs_mount.c
> ===================================================================
> --- linux-2.6-xfs.orig/fs/xfs/xfs_mount.c	2008-05-22 19:31:25.000000000 +0200
> +++ linux-2.6-xfs/fs/xfs/xfs_mount.c	2008-05-22 19:31:29.000000000 +0200
> @@ -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);
>  }
>  
>  /*
---end quoted text---

^ permalink raw reply	[flat|nested] 3+ messages in thread

* Re: [PATCH 1/4] don't leak m_fsname/m_rtname/m_logname
  2008-05-25 19:07 [PATCH 1/4] don't leak m_fsname/m_rtname/m_logname Christoph Hellwig
  2008-07-21 12:18 ` Christoph Hellwig
@ 2008-07-21 22:59 ` Dave Chinner
  1 sibling, 0 replies; 3+ messages in thread
From: Dave Chinner @ 2008-07-21 22:59 UTC (permalink / raw)
  To: Christoph Hellwig; +Cc: xfs

On Sun, May 25, 2008 at 09:07:37PM +0200, Christoph Hellwig wrote:
> 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.

Looks good.

Cheers,

Dave.
-- 
Dave Chinner
david@fromorbit.com

^ permalink raw reply	[flat|nested] 3+ messages in thread

end of thread, other threads:[~2008-07-21 22:58 UTC | newest]

Thread overview: 3+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2008-05-25 19:07 [PATCH 1/4] don't leak m_fsname/m_rtname/m_logname Christoph Hellwig
2008-07-21 12:18 ` Christoph Hellwig
2008-07-21 22:59 ` Dave Chinner

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox