diff --git a/ChangeLog b/ChangeLog index 5c5d1d2a7..749d64c3f 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,13 @@ +2012-05-09 Vladimir Serbinenko + + Fix wrapped HFS+ handling. + + * grub-core/fs/fshelp.c (grub_fshelp_read_file): New argument + blocks_start. All users updated. + * grub-core/fs/hfsplus.c (grub_hfsplus_read_block): Don't add + wrapping offset. + (grub_hfsplus_read_file): Pass embedding offset to fshelp_read_file. + 2012-05-09 Vladimir Serbinenko Fix long symlinks on reiserfs. diff --git a/grub-core/fs/affs.c b/grub-core/fs/affs.c index 01ab26eb7..e88d06980 100644 --- a/grub-core/fs/affs.c +++ b/grub-core/fs/affs.c @@ -498,7 +498,7 @@ grub_affs_read (grub_file_t file, char *buf, grub_size_t len) file->read_hook, file->offset, len, buf, grub_affs_read_block, grub_be_to_cpu32 (data->diropen.di.size), - data->log_blocksize); + data->log_blocksize, 0); } static grub_int32_t diff --git a/grub-core/fs/ext2.c b/grub-core/fs/ext2.c index 7ff3cb6f5..e337bebf2 100644 --- a/grub-core/fs/ext2.c +++ b/grub-core/fs/ext2.c @@ -520,7 +520,7 @@ grub_ext2_read_file (grub_fshelp_node_t node, pos, len, buf, grub_ext2_read_block, grub_cpu_to_le32 (node->inode.size) | (((grub_off_t) grub_cpu_to_le32 (node->inode.size_high)) << 32), - LOG2_EXT2_BLOCK_SIZE (node->data)); + LOG2_EXT2_BLOCK_SIZE (node->data), 0); } diff --git a/grub-core/fs/fshelp.c b/grub-core/fs/fshelp.c index 5a2e0ff2b..0d4162ea7 100644 --- a/grub-core/fs/fshelp.c +++ b/grub-core/fs/fshelp.c @@ -233,7 +233,8 @@ grub_fshelp_read_file (grub_disk_t disk, grub_fshelp_node_t node, grub_off_t pos, grub_size_t len, char *buf, grub_disk_addr_t (*get_block) (grub_fshelp_node_t node, grub_disk_addr_t block), - grub_off_t filesize, int log2blocksize) + grub_off_t filesize, int log2blocksize, + grub_disk_addr_t blocks_start) { grub_disk_addr_t i, blockcnt; int blocksize = 1 << (log2blocksize + GRUB_DISK_SECTOR_BITS); @@ -281,7 +282,7 @@ grub_fshelp_read_file (grub_disk_t disk, grub_fshelp_node_t node, { disk->read_hook = read_hook; - grub_disk_read (disk, blknr, skipfirst, + grub_disk_read (disk, blknr + blocks_start, skipfirst, blockend, buf); disk->read_hook = 0; if (grub_errno) diff --git a/grub-core/fs/hfsplus.c b/grub-core/fs/hfsplus.c index cd37b6448..8066c117d 100644 --- a/grub-core/fs/hfsplus.c +++ b/grub-core/fs/hfsplus.c @@ -327,9 +327,7 @@ grub_hfsplus_read_block (grub_fshelp_node_t node, grub_disk_addr_t fileblock) nnode = 0; if (blk != 0xffffffffffffffffULL) - return (blk - + (node->data->embedded_offset >> (node->data->log2blksize - - GRUB_DISK_SECTOR_BITS))); + return blk; /* For the extent overflow file, extra extents can't be found in the extent overflow file. If this happens, you found a @@ -382,7 +380,8 @@ grub_hfsplus_read_file (grub_fshelp_node_t node, return grub_fshelp_read_file (node->data->disk, node, read_hook, pos, len, buf, grub_hfsplus_read_block, node->size, - node->data->log2blksize - GRUB_DISK_SECTOR_BITS); + node->data->log2blksize - GRUB_DISK_SECTOR_BITS, + node->data->embedded_offset); } static struct grub_hfsplus_data * diff --git a/grub-core/fs/nilfs2.c b/grub-core/fs/nilfs2.c index d39ea9ed3..f36c513fa 100644 --- a/grub-core/fs/nilfs2.c +++ b/grub-core/fs/nilfs2.c @@ -635,7 +635,7 @@ grub_nilfs2_read_file (grub_fshelp_node_t node, return grub_fshelp_read_file (node->data->disk, node, read_hook, pos, len, buf, grub_nilfs2_read_block, grub_le_to_cpu64 (node->inode.i_size), - LOG2_NILFS2_BLOCK_SIZE (node->data)); + LOG2_NILFS2_BLOCK_SIZE (node->data), 0); } diff --git a/grub-core/fs/ntfs.c b/grub-core/fs/ntfs.c index eb831a149..aaa7b2df9 100644 --- a/grub-core/fs/ntfs.c +++ b/grub-core/fs/ntfs.c @@ -483,7 +483,7 @@ read_data (struct grub_ntfs_attr *at, char *pa, char *dest, if (!grub_fshelp_log2blksize (ctx->comp.spc, &pow)) grub_fshelp_read_file (ctx->comp.disk, (grub_fshelp_node_t) ctx, read_hook, ofs, len, dest, - grub_ntfs_read_block, ofs + len, pow); + grub_ntfs_read_block, ofs + len, pow, 0); return grub_errno; } diff --git a/grub-core/fs/sfs.c b/grub-core/fs/sfs.c index 798a70afa..f7cdb0898 100644 --- a/grub-core/fs/sfs.c +++ b/grub-core/fs/sfs.c @@ -351,7 +351,7 @@ grub_sfs_read_file (grub_fshelp_node_t node, { return grub_fshelp_read_file (node->data->disk, node, read_hook, pos, len, buf, grub_sfs_read_block, - node->size, node->data->log_blocksize); + node->size, node->data->log_blocksize, 0); } diff --git a/grub-core/fs/udf.c b/grub-core/fs/udf.c index 9f2045ca5..4f0899ecf 100644 --- a/grub-core/fs/udf.c +++ b/grub-core/fs/udf.c @@ -594,7 +594,7 @@ grub_udf_read_file (grub_fshelp_node_t node, return grub_fshelp_read_file (node->data->disk, node, read_hook, pos, len, buf, grub_udf_read_block, U64 (node->block.fe.file_size), - node->data->lbshift); + node->data->lbshift, 0); } static unsigned sblocklist[] = { 256, 512, 0 }; diff --git a/grub-core/fs/xfs.c b/grub-core/fs/xfs.c index 448f5f340..9e68ea8c4 100644 --- a/grub-core/fs/xfs.c +++ b/grub-core/fs/xfs.c @@ -389,7 +389,7 @@ grub_xfs_read_file (grub_fshelp_node_t node, pos, len, buf, grub_xfs_read_block, grub_be_to_cpu64 (node->inode.size), node->data->sblock.log2_bsize - - GRUB_DISK_SECTOR_BITS); + - GRUB_DISK_SECTOR_BITS, 0); } diff --git a/include/grub/fshelp.h b/include/grub/fshelp.h index 42d8da5f2..4838fca30 100644 --- a/include/grub/fshelp.h +++ b/include/grub/fshelp.h @@ -73,7 +73,8 @@ EXPORT_FUNC(grub_fshelp_read_file) (grub_disk_t disk, grub_fshelp_node_t node, grub_off_t pos, grub_size_t len, char *buf, grub_disk_addr_t (*get_block) (grub_fshelp_node_t node, grub_disk_addr_t block), - grub_off_t filesize, int log2blocksize); + grub_off_t filesize, int log2blocksize, + grub_disk_addr_t blocks_start); unsigned int EXPORT_FUNC(grub_fshelp_log2blksize) (unsigned int blksize,