cryptodisk: Fix incorrect calculation of start sector
Here dev is a grub_cryptodisk_t and dev->offset is offset in sectors of size native to the cryptodisk device. The sector is correctly transformed into native grub sector size, but then added to dev->offset which is not transformed. It would be nice if the type system would help us with this. Signed-off-by: Glenn Washburn <development@efficientek.com> Reviewed-by: Patrick Steinhardt <ps@pks.im> Reviewed-by: Daniel Kiper <daniel.kiper@oracle.com>
This commit is contained in:
parent
3b3ac0c982
commit
e1b0992a8d
2 changed files with 11 additions and 7 deletions
|
@ -757,9 +757,8 @@ grub_cryptodisk_read (grub_disk_t disk, grub_disk_addr_t sector,
|
||||||
size, sector, dev->offset);
|
size, sector, dev->offset);
|
||||||
|
|
||||||
err = grub_disk_read (dev->source_disk,
|
err = grub_disk_read (dev->source_disk,
|
||||||
(sector << (disk->log_sector_size
|
grub_disk_from_native_sector (disk, sector + dev->offset),
|
||||||
- GRUB_DISK_SECTOR_BITS)) + dev->offset, 0,
|
0, size << disk->log_sector_size, buf);
|
||||||
size << disk->log_sector_size, buf);
|
|
||||||
if (err)
|
if (err)
|
||||||
{
|
{
|
||||||
grub_dprintf ("cryptodisk", "grub_disk_read failed with error %d\n", err);
|
grub_dprintf ("cryptodisk", "grub_disk_read failed with error %d\n", err);
|
||||||
|
@ -816,12 +815,10 @@ grub_cryptodisk_write (grub_disk_t disk, grub_disk_addr_t sector,
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Since ->write was called so disk.mod is loaded but be paranoid */
|
/* Since ->write was called so disk.mod is loaded but be paranoid */
|
||||||
|
sector = sector + dev->offset;
|
||||||
if (grub_disk_write_weak)
|
if (grub_disk_write_weak)
|
||||||
err = grub_disk_write_weak (dev->source_disk,
|
err = grub_disk_write_weak (dev->source_disk,
|
||||||
(sector << (disk->log_sector_size
|
grub_disk_from_native_sector (disk, sector),
|
||||||
- GRUB_DISK_SECTOR_BITS))
|
|
||||||
+ dev->offset,
|
|
||||||
0, size << disk->log_sector_size, tmp);
|
0, size << disk->log_sector_size, tmp);
|
||||||
else
|
else
|
||||||
err = grub_error (GRUB_ERR_BUG, "disk.mod not loaded");
|
err = grub_error (GRUB_ERR_BUG, "disk.mod not loaded");
|
||||||
|
|
|
@ -174,6 +174,13 @@ typedef struct grub_disk_memberlist *grub_disk_memberlist_t;
|
||||||
/* Return value of grub_disk_get_size() in case disk size is unknown. */
|
/* Return value of grub_disk_get_size() in case disk size is unknown. */
|
||||||
#define GRUB_DISK_SIZE_UNKNOWN 0xffffffffffffffffULL
|
#define GRUB_DISK_SIZE_UNKNOWN 0xffffffffffffffffULL
|
||||||
|
|
||||||
|
/* Convert to GRUB native disk sized sector from disk sized sector. */
|
||||||
|
static inline grub_disk_addr_t
|
||||||
|
grub_disk_from_native_sector (grub_disk_t disk, grub_disk_addr_t sector)
|
||||||
|
{
|
||||||
|
return sector << (disk->log_sector_size - GRUB_DISK_SECTOR_BITS);
|
||||||
|
}
|
||||||
|
|
||||||
/* This is called from the memory manager. */
|
/* This is called from the memory manager. */
|
||||||
void grub_disk_cache_invalidate_all (void);
|
void grub_disk_cache_invalidate_all (void);
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue