Skip to content

Commit 457ae72

Browse files
Dan Carpenterkdave
authored andcommitted
Btrfs: fix an integer overflow check
This isn't super serious because you need CAP_ADMIN to run this code. I added this integer overflow check last year but apparently I am rubbish at writing integer overflow checks... There are two issues. First, access_ok() works on unsigned long type and not u64 so on 32 bit systems the access_ok() could be checking a truncated size. The other issue is that we should be using a stricter limit so we don't overflow the kzalloc() setting ctx->clone_roots later in the function after the access_ok(): alloc_size = sizeof(struct clone_root) * (arg->clone_sources_count + 1); sctx->clone_roots = kzalloc(alloc_size, GFP_KERNEL | __GFP_NOWARN); Fixes: f5ecec3 ("btrfs: send: silence an integer overflow warning") Signed-off-by: Dan Carpenter <[email protected]> Reviewed-by: David Sterba <[email protected]> [ added comment ] Signed-off-by: David Sterba <[email protected]>
1 parent ce0dcee commit 457ae72

File tree

1 file changed

+6
-1
lines changed

1 file changed

+6
-1
lines changed

fs/btrfs/send.c

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6305,8 +6305,13 @@ long btrfs_ioctl_send(struct file *mnt_file, void __user *arg_)
63056305
goto out;
63066306
}
63076307

6308+
/*
6309+
* Check that we don't overflow at later allocations, we request
6310+
* clone_sources_count + 1 items, and compare to unsigned long inside
6311+
* access_ok.
6312+
*/
63086313
if (arg->clone_sources_count >
6309-
ULLONG_MAX / sizeof(*arg->clone_sources)) {
6314+
ULONG_MAX / sizeof(struct clone_root) - 1) {
63106315
ret = -EINVAL;
63116316
goto out;
63126317
}

0 commit comments

Comments
 (0)