FAILED: patch "[PATCH] btrfs: validate qgroup inherit for SNAP_CREATE_V2 ioctl" failed to apply to 4.9-stable tree
Subsystems (2)
[email protected]
maintainerThe patch below does not apply to the 4.9-stable tree.
If someone wants it applied there, or to any other stable or longterm tree, then please email the backport, including the original git commit id to <[email protected]>.
thanks,
greg k-h
------------------ original commit in Linus's tree ------------------
From 5011c5a663b9c6d6aff3d394f11049b371199627 Mon Sep 17 00:00:00 2001
From: Dan Carpenter <[email protected]>
Date: Wed, 17 Feb 2021 09:04:34 +0300
Subject: [PATCH] btrfs: validate qgroup inherit for SNAP_CREATE_V2 ioctl
The problem is we're copying "inherit" from user space but we don't necessarily know that we're copying enough data for a 64 byte struct. Then the next problem is that 'inherit' has a variable size array at the end, and we have to verify that array is the size we expected.
fs/btrfs/ioctl.c +18 -1
@@ -1935,7 +1935,10 @@ static noinline int btrfs_ioctl_snap_create_v2(struct file *file,if (vol_args->flags &BTRFS_SUBVOL_RDONLY ) readonly = true;if (vol_args->flags &BTRFS_SUBVOL_QGROUP_INHERIT ) { -if (vol_args->size >PAGE_SIZE ) { +u64 nums; + +if (vol_args->size <sizeof (*inherit) || + vol_args->size >PAGE_SIZE ) { ret = -EINVAL ; goto free_args; }
@@ -1944,6 +1947,20 @@ static noinline int btrfs_ioctl_snap_create_v2(struct file *file, ret =PTR_ERR (inherit); goto free_args; } + +if (inherit->num_qgroups >PAGE_SIZE || + inherit->num_ref_copies >PAGE_SIZE || + inherit->num_excl_copies >PAGE_SIZE ) { + ret = -EINVAL ; + goto free_inherit; + } + + nums = inherit->num_qgroups +2 * inherit->num_ref_copies + +2 * inherit->num_excl_copies; +if (vol_args->size !=struct_size (inherit, qgroups, nums)) { + ret = -EINVAL ; + goto free_inherit; + } } ret = __btrfs_ioctl_snap_create(file, vol_args->name, vol_args->fd,