Message ID | 20181114113524.7102-1-fdmanana@kernel.org (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | Btrfs: ensure path name is null terminated at btrfs_control_ioctl | expand |
On 11/14/2018 07:35 PM, fdmanana@kernel.org wrote: > From: Filipe Manana <fdmanana@suse.com> > > We were using the path name received from user space without checking that > it is null terminated. While btrfs-progs is well behaved and does proper > validation and null termination, someone could call the ioctl and pass > a non-null terminated patch, leading to buffer overrun problems in the > kernel. > > So just set the last byte of the path to a null character, similar to what > we do in other ioctls (add/remove/resize device, snapshot creation, etc). > > Signed-off-by: Filipe Manana <fdmanana@suse.com> Reviewed-by: Anand Jain <anand.jain@oracle.com> Thanks, Anand > --- > fs/btrfs/super.c | 1 + > 1 file changed, 1 insertion(+) > > diff --git a/fs/btrfs/super.c b/fs/btrfs/super.c > index 6601c9aa5e35..8ad145820ea8 100644 > --- a/fs/btrfs/super.c > +++ b/fs/btrfs/super.c > @@ -2235,6 +2235,7 @@ static long btrfs_control_ioctl(struct file *file, unsigned int cmd, > vol = memdup_user((void __user *)arg, sizeof(*vol)); > if (IS_ERR(vol)) > return PTR_ERR(vol); > + vol->name[BTRFS_PATH_NAME_MAX] = '\0'; > > switch (cmd) { > case BTRFS_IOC_SCAN_DEV: >
On Wed, Nov 14, 2018 at 11:35:24AM +0000, fdmanana@kernel.org wrote: > From: Filipe Manana <fdmanana@suse.com> > > We were using the path name received from user space without checking that > it is null terminated. While btrfs-progs is well behaved and does proper > validation and null termination, someone could call the ioctl and pass > a non-null terminated patch, leading to buffer overrun problems in the > kernel. > > So just set the last byte of the path to a null character, similar to what > we do in other ioctls (add/remove/resize device, snapshot creation, etc). > > Signed-off-by: Filipe Manana <fdmanana@suse.com> Good catch, thanks Reviewed-by: David Sterba <dsterba@suse.com>
diff --git a/fs/btrfs/super.c b/fs/btrfs/super.c index 6601c9aa5e35..8ad145820ea8 100644 --- a/fs/btrfs/super.c +++ b/fs/btrfs/super.c @@ -2235,6 +2235,7 @@ static long btrfs_control_ioctl(struct file *file, unsigned int cmd, vol = memdup_user((void __user *)arg, sizeof(*vol)); if (IS_ERR(vol)) return PTR_ERR(vol); + vol->name[BTRFS_PATH_NAME_MAX] = '\0'; switch (cmd) { case BTRFS_IOC_SCAN_DEV: