Commit a738159d authored by Christoph Hellwig's avatar Christoph Hellwig Committed by Lachlan McIlroy

[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: default avatarChristoph Hellwig <hch@infradead.org>
Signed-off-by: default avatarNiv Sardi <xaiki@sgi.com>
Signed-off-by: default avatarDavid Chinner <david@fromorbit.com>
Signed-off-by: default avatarLachlan McIlroy <lachlan@sgi.com>
parent 5e9da7b7
...@@ -1200,6 +1200,15 @@ xfssyncd( ...@@ -1200,6 +1200,15 @@ xfssyncd(
return 0; 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 STATIC void
xfs_fs_put_super( xfs_fs_put_super(
struct super_block *sb) struct super_block *sb)
...@@ -1261,6 +1270,7 @@ xfs_fs_put_super( ...@@ -1261,6 +1270,7 @@ xfs_fs_put_super(
xfs_close_devices(mp); xfs_close_devices(mp);
xfs_qmops_put(mp); xfs_qmops_put(mp);
xfs_dmops_put(mp); xfs_dmops_put(mp);
xfs_free_fsname(mp);
kfree(mp); kfree(mp);
} }
...@@ -1517,6 +1527,8 @@ xfs_start_flags( ...@@ -1517,6 +1527,8 @@ xfs_start_flags(
struct xfs_mount_args *ap, struct xfs_mount_args *ap,
struct xfs_mount *mp) struct xfs_mount *mp)
{ {
int error;
/* Values are in BBs */ /* Values are in BBs */
if ((ap->flags & XFSMNT_NOALIGN) != XFSMNT_NOALIGN) { if ((ap->flags & XFSMNT_NOALIGN) != XFSMNT_NOALIGN) {
/* /*
...@@ -1549,17 +1561,27 @@ xfs_start_flags( ...@@ -1549,17 +1561,27 @@ xfs_start_flags(
ap->logbufsize); ap->logbufsize);
return XFS_ERROR(EINVAL); return XFS_ERROR(EINVAL);
} }
error = ENOMEM;
mp->m_logbsize = ap->logbufsize; mp->m_logbsize = ap->logbufsize;
mp->m_fsname_len = strlen(ap->fsname) + 1; 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]) { if (ap->rtname[0]) {
mp->m_rtname = kmem_alloc(strlen(ap->rtname) + 1, KM_SLEEP); mp->m_rtname = kstrdup(ap->rtname, GFP_KERNEL);
strcpy(mp->m_rtname, ap->rtname); if (!mp->m_rtname)
goto out_free_fsname;
} }
if (ap->logname[0]) { if (ap->logname[0]) {
mp->m_logname = kmem_alloc(strlen(ap->logname) + 1, KM_SLEEP); mp->m_logname = kstrdup(ap->logname, GFP_KERNEL);
strcpy(mp->m_logname, ap->logname); if (!mp->m_logname)
goto out_free_rtname;
} }
if (ap->flags & XFSMNT_WSYNC) if (ap->flags & XFSMNT_WSYNC)
...@@ -1632,6 +1654,14 @@ xfs_start_flags( ...@@ -1632,6 +1654,14 @@ xfs_start_flags(
if (ap->flags & XFSMNT_DMAPI) if (ap->flags & XFSMNT_DMAPI)
mp->m_flags |= XFS_MOUNT_DMAPI; mp->m_flags |= XFS_MOUNT_DMAPI;
return 0; 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( ...@@ -1792,10 +1822,10 @@ xfs_fs_fill_super(
*/ */
error = xfs_start_flags(args, mp); error = xfs_start_flags(args, mp);
if (error) if (error)
goto out_destroy_counters; goto out_free_fsname;
error = xfs_readsb(mp, flags); error = xfs_readsb(mp, flags);
if (error) if (error)
goto out_destroy_counters; goto out_free_fsname;
error = xfs_finish_flags(args, mp); error = xfs_finish_flags(args, mp);
if (error) if (error)
goto out_free_sb; goto out_free_sb;
...@@ -1857,7 +1887,8 @@ xfs_fs_fill_super( ...@@ -1857,7 +1887,8 @@ xfs_fs_fill_super(
xfs_filestream_unmount(mp); xfs_filestream_unmount(mp);
out_free_sb: out_free_sb:
xfs_freesb(mp); xfs_freesb(mp);
out_destroy_counters: out_free_fsname:
xfs_free_fsname(mp);
xfs_icsb_destroy_counters(mp); xfs_icsb_destroy_counters(mp);
xfs_close_devices(mp); xfs_close_devices(mp);
out_put_qmops: out_put_qmops:
...@@ -1893,7 +1924,7 @@ xfs_fs_fill_super( ...@@ -1893,7 +1924,7 @@ xfs_fs_fill_super(
IRELE(mp->m_rootip); IRELE(mp->m_rootip);
xfs_unmountfs(mp); xfs_unmountfs(mp);
goto out_destroy_counters; goto out_free_fsname;
} }
STATIC int STATIC int
......
...@@ -146,13 +146,6 @@ xfs_mount_free( ...@@ -146,13 +146,6 @@ xfs_mount_free(
mutex_destroy(&mp->m_growlock); mutex_destroy(&mp->m_growlock);
if (mp->m_quotainfo) if (mp->m_quotainfo)
XFS_QM_DONE(mp); 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);
} }
/* /*
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment