* grub-core/fs/btrfs.c (grub_btrfs_lzo_decompress): Fix offset when

crossing page boundary.
This commit is contained in:
Vladimir 'phcoder' Serbinenko 2012-05-03 22:16:45 +02:00
parent aa01499d05
commit 9e8bc27a40
2 changed files with 16 additions and 1 deletions

View file

@ -1,3 +1,8 @@
2012-05-03 Vladimir Serbinenko <phcoder@gmail.com>
* grub-core/fs/btrfs.c (grub_btrfs_lzo_decompress): Fix offset when
crossing page boundary.
2012-05-03 Vladimir Serbinenko <phcoder@gmail.com>
Fix B-tree search in BFS, especially in presence of non-ASCII

View file

@ -913,8 +913,10 @@ static grub_ssize_t
grub_btrfs_lzo_decompress(char *ibuf, grub_size_t isize, grub_off_t off,
char *obuf, grub_size_t osize)
{
grub_uint32_t total_size, cblock_size, ret = 0;
grub_uint32_t total_size, cblock_size;
grub_size_t ret = 0;
unsigned char buf[GRUB_BTRFS_LZO_BLOCK_SIZE];
char *ibuf0 = ibuf;
total_size = grub_le_to_cpu32 (grub_get_unaligned32 (ibuf));
ibuf += sizeof (total_size);
@ -925,6 +927,10 @@ grub_btrfs_lzo_decompress(char *ibuf, grub_size_t isize, grub_off_t off,
/* Jump forward to first block with requested data. */
while (off >= GRUB_BTRFS_LZO_BLOCK_SIZE)
{
/* Don't let following uint32_t cross the page boundary. */
if (((ibuf - ibuf0) & 0xffc) == 0xffc)
ibuf = ((ibuf - ibuf0 + 3) & ~3) + ibuf0;
cblock_size = grub_le_to_cpu32 (grub_get_unaligned32 (ibuf));
ibuf += sizeof (cblock_size);
@ -939,6 +945,10 @@ grub_btrfs_lzo_decompress(char *ibuf, grub_size_t isize, grub_off_t off,
{
lzo_uint usize = GRUB_BTRFS_LZO_BLOCK_SIZE;
/* Don't let following uint32_t cross the page boundary. */
if (((ibuf - ibuf0) & 0xffc) == 0xffc)
ibuf = ((ibuf - ibuf0 + 3) & ~3) + ibuf0;
cblock_size = grub_le_to_cpu32 (grub_get_unaligned32 (ibuf));
ibuf += sizeof (cblock_size);