]> git.ipfire.org Git - thirdparty/grub.git/commitdiff
Fix wrapped HFS+ handling.
authorVladimir 'phcoder' Serbinenko <phcoder@gmail.com>
Wed, 9 May 2012 11:02:59 +0000 (13:02 +0200)
committerVladimir 'phcoder' Serbinenko <phcoder@gmail.com>
Wed, 9 May 2012 11:02:59 +0000 (13:02 +0200)
* 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.

ChangeLog
grub-core/fs/affs.c
grub-core/fs/ext2.c
grub-core/fs/fshelp.c
grub-core/fs/hfsplus.c
grub-core/fs/nilfs2.c
grub-core/fs/ntfs.c
grub-core/fs/sfs.c
grub-core/fs/udf.c
grub-core/fs/xfs.c
include/grub/fshelp.h

index 5c5d1d2a786f8b52fe3fa4aeecbf911f145a4109..749d64c3f38c87138bf06e4dbe83142d2275d5a3 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,13 @@
+2012-05-09  Vladimir Serbinenko  <phcoder@gmail.com>
+
+       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  <phcoder@gmail.com>
 
        Fix long symlinks on reiserfs.
index 01ab26eb7d9e76acd003e967f2065af6dc0c4e4b..e88d06980944aae11227fae8eb60da15cf5d6c39 100644 (file)
@@ -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
index 7ff3cb6f59278e33f9569c02cc18e72b941c29d1..e337bebf2af43015b4b41cc2fee4e7073a5cc62a 100644 (file)
@@ -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);
 
 }
 
index 5a2e0ff2b4f6f039465679e4b2ec699c7eeda99b..0d4162ea7ac9c71bb845a309a70bb22278b3c6cd 100644 (file)
@@ -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)
index cd37b64484014373a14fe271c2a08e245384e646..8066c117d5754c2e13a722c106fccfb52809e3cf 100644 (file)
@@ -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 *
index d39ea9ed37ada96da3781c39c424c6d882205849..f36c513fa9357addd80f782cbb53fc17cf296328 100644 (file)
@@ -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);
 
 }
 
index eb831a149bf61521e4958388f39a153495adceaa..aaa7b2df99a1b35c01e8203101fdb9bdc18219f2 100644 (file)
@@ -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;
     }
 
index 798a70afaf294a96868d5cdf2218b1809e20d7e5..f7cdb089882dc9491237b254124aec4330262fc2 100644 (file)
@@ -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);
 }
 
 
index 9f2045ca5c7e79049b0cbf3d7335bd3963cd8835..4f0899ecf2f3d927d8fc2883cfb7bd5276f7b0e9 100644 (file)
@@ -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 };
index 448f5f340a40484d72ca5778fd0541837b3960c3..9e68ea8c4c19a79f1639c62f3528e3df2579a6e9 100644 (file)
@@ -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);
 }
 
 
index 42d8da5f2443498a3570bdae3dd75d0879a37da7..4838fca3036c0e1bb3d0e070343270ebeea08229 100644 (file)
@@ -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,