From: Wenliang Fan <fanwlexca@gmail.com>
Date: Fri, 20 Dec 2013 07:28:56 +0000 (+0800)
Subject: fs/btrfs: Integer overflow in btrfs_ioctl_resize()
X-Git-Url: http://git.maquefel.me/?a=commitdiff_plain;h=eb8052e015f2c015926db45943f8ee724ace97e5;p=linux.git

fs/btrfs: Integer overflow in btrfs_ioctl_resize()

The local variable 'new_size' comes from userspace. If a large number
was passed, there would be an integer overflow in the following line:
	new_size = old_size + new_size;

Signed-off-by: Wenliang Fan <fanwlexca@gmail.com>
Signed-off-by: Josef Bacik <jbacik@fb.com>
Signed-off-by: Chris Mason <clm@fb.com>
---

diff --git a/fs/btrfs/ioctl.c b/fs/btrfs/ioctl.c
index edf5f0093f222..ed3edc2832554 100644
--- a/fs/btrfs/ioctl.c
+++ b/fs/btrfs/ioctl.c
@@ -1474,6 +1474,10 @@ static noinline int btrfs_ioctl_resize(struct file *file,
 		}
 		new_size = old_size - new_size;
 	} else if (mod > 0) {
+		if (new_size > ULLONG_MAX - old_size) {
+			ret = -EINVAL;
+			goto out_free;
+		}
 		new_size = old_size + new_size;
 	}