]> granicus.if.org Git - zfs/commitdiff
Fix spa reference leak in zfs_ioc_pool_scan
authorLOLi <loli10K@users.noreply.github.com>
Wed, 4 Apr 2018 00:31:30 +0000 (02:31 +0200)
committerBrian Behlendorf <behlendorf1@llnl.gov>
Wed, 4 Apr 2018 00:31:30 +0000 (17:31 -0700)
zfs_ioc_pool_scan leaks a spa reference when zc->zc_flags is not a
valid pool_scrub_cmd_t: this could happen if the userland binaries
and ZFS kernel module differ in version and would prevent the pool from
being exported.

Reviewed by: Matt Ahrens <matt@delphix.com>
Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov>
Reviewed-by: Giuseppe Di Natale <dinatale2@llnl.gov>
Signed-off-by: loli10K <ezomori.nozomu@gmail.com>
Closes #7380

module/zfs/zfs_ioctl.c

index 8ef4cc46f09b8929a2ecbb2f221fde54bcb57a37..1e987dc885c494aaab42ad6676d2dfe206a945ca 100644 (file)
@@ -1732,12 +1732,12 @@ zfs_ioc_pool_scan(zfs_cmd_t *zc)
        spa_t *spa;
        int error;
 
-       if ((error = spa_open(zc->zc_name, &spa, FTAG)) != 0)
-               return (error);
-
        if (zc->zc_flags >= POOL_SCRUB_FLAGS_END)
                return (SET_ERROR(EINVAL));
 
+       if ((error = spa_open(zc->zc_name, &spa, FTAG)) != 0)
+               return (error);
+
        if (zc->zc_flags == POOL_SCRUB_PAUSE)
                error = spa_scrub_pause_resume(spa, POOL_SCRUB_PAUSE);
        else if (zc->zc_cookie == POOL_SCAN_NONE)