]> git.proxmox.com Git - mirror_zfs.git/commitdiff
FreeBSD: Fix leaked strings in libspl mnttab
authorRyan Moeller <ryan@iXsystems.com>
Fri, 14 Jan 2022 20:38:32 +0000 (15:38 -0500)
committerGitHub <noreply@github.com>
Fri, 14 Jan 2022 20:38:32 +0000 (12:38 -0800)
The FreeBSD implementations of various libspl functions for getting
mounted device information were found to leak several strings which
were being allocated in statfs2mnttab but never freed.

The Solaris getmntany(3C) and related interfaces are expected to return
strings residing in static buffers that need to be copied rather than
freed by the caller.

Use static thread-local storage to stash the mnttab structure strings
from FreeBSD's statfs info rather than strings allocated on the heap by
strdup(3).

While here, remove some stray commented out lines.

Reviewed-by: Alexander Motin <mav@FreeBSD.org>
Reviewed-by: Rich Ercolani <rincebrain@gmail.com>
Signed-off-by: Ryan Moeller <ryan@iXsystems.com>
Closes #12961

lib/libspl/os/freebsd/mnttab.c

index bd3e3e4e3eef3f4be16788f1859e6ab647af0c32..d830257fbd16f7ff7d29dce8745fa4390f05b05d 100644 (file)
@@ -91,16 +91,28 @@ optadd(char *mntopts, size_t size, const char *opt)
        strlcat(mntopts, opt, size);
 }
 
+static __thread char gfstypename[MFSNAMELEN];
+static __thread char gmntfromname[MNAMELEN];
+static __thread char gmntonname[MNAMELEN];
+static __thread char gmntopts[MNTMAXSTR];
+
 void
 statfs2mnttab(struct statfs *sfs, struct mnttab *mp)
 {
-       static char mntopts[MNTMAXSTR];
        long flags;
 
-       mntopts[0] = '\0';
+       strlcpy(gfstypename, sfs->f_fstypename, sizeof (gfstypename));
+       mp->mnt_fstype = gfstypename;
+
+       strlcpy(gmntfromname, sfs->f_mntfromname, sizeof (gmntfromname));
+       mp->mnt_special = gmntfromname;
+
+       strlcpy(gmntonname, sfs->f_mntonname, sizeof (gmntonname));
+       mp->mnt_mountp = gmntonname;
 
        flags = sfs->f_flags;
-#define        OPTADD(opt)     optadd(mntopts, sizeof (mntopts), (opt))
+       gmntopts[0] = '\0';
+#define        OPTADD(opt)     optadd(gmntopts, sizeof (gmntopts), (opt))
        if (flags & MNT_RDONLY)
                OPTADD(MNTOPT_RO);
        else
@@ -121,10 +133,7 @@ statfs2mnttab(struct statfs *sfs, struct mnttab *mp)
        else
                OPTADD(MNTOPT_EXEC);
 #undef OPTADD
-       mp->mnt_special = strdup(sfs->f_mntfromname);
-       mp->mnt_mountp = strdup(sfs->f_mntonname);
-       mp->mnt_fstype = strdup(sfs->f_fstypename);
-       mp->mnt_mntopts = strdup(mntopts);
+       mp->mnt_mntopts = gmntopts;
 }
 
 static struct statfs *gsfs = NULL;
@@ -166,7 +175,6 @@ fail:
 int
 getmntany(FILE *fd __unused, struct mnttab *mgetp, struct mnttab *mrefp)
 {
-       //      struct statfs *sfs;
        int i, error;
 
        error = statfs_init();
@@ -195,7 +203,6 @@ getmntany(FILE *fd __unused, struct mnttab *mgetp, struct mnttab *mrefp)
 int
 getmntent(FILE *fp, struct mnttab *mp)
 {
-       //      struct statfs *sfs;
        int error, nfs;
 
        nfs = (int)lseek(fileno(fp), 0, SEEK_CUR);