Commit 97387e3baaf3c35ad560f8878e943c720a77da1b

Authored by Anton Altaparmakov
1 parent 9b556248ec

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