Commit 97387e3baaf3c35ad560f8878e943c720a77da1b
1 parent
9b556248ec
Exists in
smarc-l5.0.0_1.0.0-ga
and in
5 other branches
LDM: Fix reassembly of extended VBLKs.
From: Ben Hutchings <ben@decadent.org.uk> Extended VBLKs (those larger than the preset VBLK size) are divided into fragments, each with its own VBLK header. Our LDM implementation generally assumes that each VBLK is contiguous in memory, so these fragments must be assembled before further processing. Currently the reassembly seems to be done quite wrongly - no VBLK header is copied into the contiguous buffer, and the length of the header is subtracted twice from each fragment. Also the total length of the reassembled VBLK is calculated incorrectly. Signed-off-by: Ben Hutchings <ben@decadent.org.uk> Signed-off-by: Anton Altaparmakov <anton@tuxera.com>
Showing 1 changed file with 4 additions and 7 deletions Side-by-side Diff
block/partitions/ldm.c
... | ... | @@ -2,7 +2,7 @@ |
2 | 2 | * ldm - Support for Windows Logical Disk Manager (Dynamic Disks) |
3 | 3 | * |
4 | 4 | * Copyright (C) 2001,2002 Richard Russon <ldm@flatcap.org> |
5 | - * Copyright (c) 2001-2007 Anton Altaparmakov | |
5 | + * Copyright (c) 2001-2012 Anton Altaparmakov | |
6 | 6 | * Copyright (C) 2001,2002 Jakob Kemi <jakob.kemi@telia.com> |
7 | 7 | * |
8 | 8 | * Documentation is available at http://www.linux-ntfs.org/doku.php?id=downloads |
9 | 9 | |
10 | 10 | |
11 | 11 | |
... | ... | @@ -1341,20 +1341,17 @@ |
1341 | 1341 | ldm_error("REC value (%d) exceeds NUM value (%d)", rec, f->num); |
1342 | 1342 | return false; |
1343 | 1343 | } |
1344 | - | |
1345 | 1344 | if (f->map & (1 << rec)) { |
1346 | 1345 | ldm_error ("Duplicate VBLK, part %d.", rec); |
1347 | 1346 | f->map &= 0x7F; /* Mark the group as broken */ |
1348 | 1347 | return false; |
1349 | 1348 | } |
1350 | - | |
1351 | 1349 | f->map |= (1 << rec); |
1352 | - | |
1350 | + if (!rec) | |
1351 | + memcpy(f->data, data, VBLK_SIZE_HEAD); | |
1353 | 1352 | data += VBLK_SIZE_HEAD; |
1354 | 1353 | size -= VBLK_SIZE_HEAD; |
1355 | - | |
1356 | - memcpy (f->data+rec*(size-VBLK_SIZE_HEAD)+VBLK_SIZE_HEAD, data, size); | |
1357 | - | |
1354 | + memcpy(f->data + VBLK_SIZE_HEAD + rec * size, data, size); | |
1358 | 1355 | return true; |
1359 | 1356 | } |
1360 | 1357 |