mirror of
git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2025-08-05 16:54:27 +00:00
udf: Do not bother merging very long extents
When merging very long extents we try to push as much length as possible to the first extent. However this is unnecessarily complicated and not really worth the trouble. Furthermore there was a bug in the logic resulting in corrupting extents in the file as syzbot reproducer shows. So just don't bother with the merging of extents that are too long together. CC: stable@vger.kernel.org Reported-by: syzbot+60f291a24acecb3c2bd5@syzkaller.appspotmail.com Signed-off-by: Jan Kara <jack@suse.cz>
This commit is contained in:
parent
70bfb3a8d6
commit
53cafe1d6d
1 changed files with 2 additions and 17 deletions
|
@ -997,23 +997,8 @@ static void udf_merge_extents(struct inode *inode, struct kernel_long_ad *laarr,
|
|||
blocksize - 1) >> blocksize_bits)))) {
|
||||
|
||||
if (((li->extLength & UDF_EXTENT_LENGTH_MASK) +
|
||||
(lip1->extLength & UDF_EXTENT_LENGTH_MASK) +
|
||||
blocksize - 1) & ~UDF_EXTENT_LENGTH_MASK) {
|
||||
lip1->extLength = (lip1->extLength -
|
||||
(li->extLength &
|
||||
UDF_EXTENT_LENGTH_MASK) +
|
||||
UDF_EXTENT_LENGTH_MASK) &
|
||||
~(blocksize - 1);
|
||||
li->extLength = (li->extLength &
|
||||
UDF_EXTENT_FLAG_MASK) +
|
||||
(UDF_EXTENT_LENGTH_MASK + 1) -
|
||||
blocksize;
|
||||
lip1->extLocation.logicalBlockNum =
|
||||
li->extLocation.logicalBlockNum +
|
||||
((li->extLength &
|
||||
UDF_EXTENT_LENGTH_MASK) >>
|
||||
blocksize_bits);
|
||||
} else {
|
||||
(lip1->extLength & UDF_EXTENT_LENGTH_MASK) +
|
||||
blocksize - 1) <= UDF_EXTENT_LENGTH_MASK) {
|
||||
li->extLength = lip1->extLength +
|
||||
(((li->extLength &
|
||||
UDF_EXTENT_LENGTH_MASK) +
|
||||
|
|
Loading…
Add table
Reference in a new issue