]> git.proxmox.com Git - mirror_zfs.git/commitdiff
Fix zfs_unmount() and zfs_unshare_proto() leaks
authorcao <cao.xuewen@zte.com.cn>
Wed, 31 Aug 2016 10:35:52 +0000 (18:35 +0800)
committerBrian Behlendorf <behlendorf1@llnl.gov>
Thu, 1 Sep 2016 18:39:45 +0000 (11:39 -0700)
Always free mnpt memory on failure in the zfs_unmount() function.

In the zfs_unshare_proto() function mountpoint is a const and
should not be assigned.

Signed-off-by: cao.xuewen <cao.xuewen@zte.com.cn>
Signed-off-by: Brian Behlendorf <behlendorf1@llnl.gov>
Closes #5054

lib/libzfs/libzfs_mount.c

index dfb748fc51765b8a9841d63f759033d1f778deac..8c7f326380d91443b9684067e7055c37336e13c0 100644 (file)
@@ -564,8 +564,10 @@ zfs_unmount(zfs_handle_t *zhp, const char *mountpoint, int flags)
                /*
                 * Unshare and unmount the filesystem
                 */
-               if (zfs_unshare_proto(zhp, mntpt, share_all_proto) != 0)
+               if (zfs_unshare_proto(zhp, mntpt, share_all_proto) != 0) {
+                       free(mntpt);
                        return (-1);
+               }
 
                if (unmount_one(hdl, mntpt, flags) != 0) {
                        free(mntpt);
@@ -904,7 +906,7 @@ zfs_unshare_proto(zfs_handle_t *zhp, const char *mountpoint,
 
        /* check to see if need to unmount the filesystem */
        if (mountpoint != NULL)
-               mountpoint = mntpt = zfs_strdup(hdl, mountpoint);
+               mntpt = zfs_strdup(hdl, mountpoint);
 
        if (mountpoint != NULL || ((zfs_get_type(zhp) == ZFS_TYPE_FILESYSTEM) &&
            libzfs_mnttab_find(hdl, zfs_get_name(zhp), &entry) == 0)) {
@@ -918,7 +920,7 @@ zfs_unshare_proto(zfs_handle_t *zhp, const char *mountpoint,
 
                        if (is_shared(hdl, mntpt, *curr_proto) &&
                            unshare_one(hdl, zhp->zfs_name,
-                                       mntpt, *curr_proto) != 0) {
+                           mntpt, *curr_proto) != 0) {
                                if (mntpt != NULL)
                                        free(mntpt);
                                return (-1);