diff options
author | Chunwei Chen <[email protected]> | 2017-08-21 13:11:11 -0700 |
---|---|---|
committer | Brian Behlendorf <[email protected]> | 2017-08-21 13:11:11 -0700 |
commit | 05f85a6a64e999748ffbdf7a76b406f0f0ceb8b3 (patch) | |
tree | f12e41943d459d7380d2aef0f62b7063b0e100a6 /module/zfs/zfs_ioctl.c | |
parent | 551905dd475c6b4c4fa87d7734f018084a755af8 (diff) |
Fix zfs_ioc_pool_sync should not use fnvlist
Use fnvlist on user input would allow user to easily panic zfs.
Reviewed-by: Brian Behlendorf <[email protected]>
Reviewed-by: Giuseppe Di Natale <[email protected]>
Reviewed-by: Alek Pinchuk <[email protected]>
Signed-off-by: Chunwei Chen <[email protected]>
Closes #6529
Diffstat (limited to 'module/zfs/zfs_ioctl.c')
-rw-r--r-- | module/zfs/zfs_ioctl.c | 12 |
1 files changed, 9 insertions, 3 deletions
diff --git a/module/zfs/zfs_ioctl.c b/module/zfs/zfs_ioctl.c index 9f32d00ac..b51b3b79c 100644 --- a/module/zfs/zfs_ioctl.c +++ b/module/zfs/zfs_ioctl.c @@ -5983,20 +5983,26 @@ static int zfs_ioc_pool_sync(const char *pool, nvlist_t *innvl, nvlist_t *onvl) { int err; - boolean_t force; + boolean_t force = B_FALSE; spa_t *spa; if ((err = spa_open(pool, &spa, FTAG)) != 0) return (err); - force = fnvlist_lookup_boolean_value(innvl, "force"); + if (innvl) { + if (nvlist_lookup_boolean_value(innvl, "force", &force) != 0) { + err = SET_ERROR(EINVAL); + goto out; + } + } + if (force) { spa_config_enter(spa, SCL_CONFIG, FTAG, RW_WRITER); vdev_config_dirty(spa->spa_root_vdev); spa_config_exit(spa, SCL_CONFIG, FTAG); } txg_wait_synced(spa_get_dsl(spa), 0); - +out: spa_close(spa, FTAG); return (err); |