* grub-core/fs/hfsplus.c (grub_hfsplus_btree_recoffset): Handle the
case of aunaligned recptr. (grub_hfsplus_read_block): Declare extoverflow as key to ensure alignment. (grub_hfsplus_btree_search): Handle unaligned index.
This commit is contained in:
parent
728cba91d2
commit
4c5f3056c2
2 changed files with 20 additions and 13 deletions
|
@ -1,3 +1,11 @@
|
||||||
|
2011-12-13 Vladimir Serbinenko <phcoder@gmail.com>
|
||||||
|
|
||||||
|
* grub-core/fs/hfsplus.c (grub_hfsplus_btree_recoffset): Handle the
|
||||||
|
case of aunaligned recptr.
|
||||||
|
(grub_hfsplus_read_block): Declare extoverflow as key to ensure
|
||||||
|
alignment.
|
||||||
|
(grub_hfsplus_btree_search): Handle unaligned index.
|
||||||
|
|
||||||
2011-12-13 Vladimir Serbinenko <phcoder@gmail.com>
|
2011-12-13 Vladimir Serbinenko <phcoder@gmail.com>
|
||||||
|
|
||||||
* grub-core/fs/xfs.c (grub_xfs_iterate_dir): Use grub_get_unaligned16
|
* grub-core/fs/xfs.c (grub_xfs_iterate_dir): Use grub_get_unaligned16
|
||||||
|
|
|
@ -251,10 +251,9 @@ grub_hfsplus_btree_recoffset (struct grub_hfsplus_btree *btree,
|
||||||
struct grub_hfsplus_btnode *node, int index)
|
struct grub_hfsplus_btnode *node, int index)
|
||||||
{
|
{
|
||||||
char *cnode = (char *) node;
|
char *cnode = (char *) node;
|
||||||
grub_uint16_t *recptr;
|
void *recptr;
|
||||||
recptr = (grub_uint16_t *) (&cnode[btree->nodesize
|
recptr = (&cnode[btree->nodesize - index * sizeof (grub_uint16_t) - 2]);
|
||||||
- index * sizeof (grub_uint16_t) - 2]);
|
return grub_be_to_cpu16 (grub_get_unaligned16 (recptr));
|
||||||
return grub_be_to_cpu16 (*recptr);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Return a pointer to the record with the index INDEX, in the node
|
/* Return a pointer to the record with the index INDEX, in the node
|
||||||
|
@ -315,7 +314,7 @@ grub_hfsplus_read_block (grub_fshelp_node_t node, grub_disk_addr_t fileblock)
|
||||||
while (1)
|
while (1)
|
||||||
{
|
{
|
||||||
struct grub_hfsplus_extkey *key;
|
struct grub_hfsplus_extkey *key;
|
||||||
struct grub_hfsplus_extkey_internal extoverflow;
|
struct grub_hfsplus_key_internal extoverflow;
|
||||||
grub_disk_addr_t blk;
|
grub_disk_addr_t blk;
|
||||||
grub_off_t ptr;
|
grub_off_t ptr;
|
||||||
|
|
||||||
|
@ -343,11 +342,11 @@ grub_hfsplus_read_block (grub_fshelp_node_t node, grub_disk_addr_t fileblock)
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Set up the key to look for in the extent overflow file. */
|
/* Set up the key to look for in the extent overflow file. */
|
||||||
extoverflow.fileid = node->fileid;
|
extoverflow.extkey.fileid = node->fileid;
|
||||||
extoverflow.start = fileblock - blksleft;
|
extoverflow.extkey.start = fileblock - blksleft;
|
||||||
|
|
||||||
if (grub_hfsplus_btree_search (&node->data->extoverflow_tree,
|
if (grub_hfsplus_btree_search (&node->data->extoverflow_tree,
|
||||||
(struct grub_hfsplus_key_internal *) &extoverflow,
|
&extoverflow,
|
||||||
grub_hfsplus_cmp_extkey, &nnode, &ptr))
|
grub_hfsplus_cmp_extkey, &nnode, &ptr))
|
||||||
{
|
{
|
||||||
grub_error (GRUB_ERR_READ_ERROR,
|
grub_error (GRUB_ERR_READ_ERROR,
|
||||||
|
@ -697,7 +696,7 @@ grub_hfsplus_btree_search (struct grub_hfsplus_btree *btree,
|
||||||
}
|
}
|
||||||
else if (nodedesc->type == GRUB_HFSPLUS_BTNODE_TYPE_INDEX)
|
else if (nodedesc->type == GRUB_HFSPLUS_BTNODE_TYPE_INDEX)
|
||||||
{
|
{
|
||||||
grub_uint32_t *pointer;
|
void *pointer;
|
||||||
|
|
||||||
/* The place where the key could have been found didn't
|
/* The place where the key could have been found didn't
|
||||||
contain the key. This means that the previous match
|
contain the key. This means that the previous match
|
||||||
|
@ -709,10 +708,10 @@ grub_hfsplus_btree_search (struct grub_hfsplus_btree *btree,
|
||||||
that we are looking for. The last match that is
|
that we are looking for. The last match that is
|
||||||
found will be used to locate the child which can
|
found will be used to locate the child which can
|
||||||
contain the record. */
|
contain the record. */
|
||||||
pointer = (grub_uint32_t *) ((char *) currkey
|
pointer = ((char *) currkey
|
||||||
+ grub_be_to_cpu16 (currkey->keylen)
|
+ grub_be_to_cpu16 (currkey->keylen)
|
||||||
+ 2);
|
+ 2);
|
||||||
currnode = grub_be_to_cpu32 (*pointer);
|
currnode = grub_be_to_cpu32 (grub_get_unaligned32 (pointer));
|
||||||
match = 1;
|
match = 1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue