]> git.baikalelectronics.ru Git - kernel.git/commit
btrfs: fix signed overflows in btrfs_sync_file
authorDavid Sterba <dsterba@suse.com>
Mon, 9 Nov 2015 10:44:45 +0000 (11:44 +0100)
committerChris Mason <clm@fb.com>
Wed, 25 Nov 2015 13:19:50 +0000 (05:19 -0800)
commit5060901740264fddf4f59cdaaed799d1ef112c8d
tree4f1418f234da7f11144e2d512b681f004926440a
parenta939c255bfab5633fe581b26c2d4ef712e628a25
btrfs: fix signed overflows in btrfs_sync_file

The calculation of range length in btrfs_sync_file leads to signed
overflow. This was caught by PaX gcc SIZE_OVERFLOW plugin.

https://forums.grsecurity.net/viewtopic.php?f=1&t=4284

The fsync call passes 0 and LLONG_MAX, the range length does not fit to
loff_t and overflows, but the value is converted to u64 so it silently
works as expected.

The minimal fix is a typecast to u64, switching functions to take
(start, end) instead of (start, len) would be more intrusive.

Coccinelle script found that there's one more opencoded calculation of
the length.

<smpl>
@@
loff_t start, end;
@@
* end - start
</smpl>

CC: stable@vger.kernel.org
Signed-off-by: David Sterba <dsterba@suse.com>
Signed-off-by: Chris Mason <clm@fb.com>
fs/btrfs/file.c