diff --git a/ChangeLog b/ChangeLog index cbf9a414d..e33065c60 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,8 @@ +2009-02-27 Krzysztof Smiechowicz + + * fs/sfs.c (grub_sfs_read_extent): Correction to traversing extent + b-tree. + 2009-02-27 Robert Millan * kern/misc.c (grub_strtoull): Fix bug (it mistakenly parsed the diff --git a/fs/sfs.c b/fs/sfs.c index 910bbf2c8..d719e299e 100644 --- a/fs/sfs.c +++ b/fs/sfs.c @@ -172,7 +172,7 @@ grub_sfs_read_extent (struct grub_sfs_data *data, unsigned int block, return grub_errno; } - for (i = 0; i < grub_be_to_cpu16 (tree->nodes); i++) + for (i = grub_be_to_cpu16 (tree->nodes) - 1; i >= 0; i--) { #define EXTNODE(tree, index) \ @@ -180,16 +180,8 @@ grub_sfs_read_extent (struct grub_sfs_data *data, unsigned int block, + (index) * (tree)->nodesize)) /* Follow the tree down to the leaf level. */ - if ((grub_be_to_cpu32 (EXTNODE(tree, i)->key) >= block) + if ((grub_be_to_cpu32 (EXTNODE(tree, i)->key) <= block) && !tree->leaf) - { - next = grub_be_to_cpu32 (EXTNODE (tree, i - 1)->data); - break; - } - - /* In case the last node is reached just use that one, it is - the right match. */ - if (i + 1 == grub_be_to_cpu16 (tree->nodes) && !tree->leaf) { next = grub_be_to_cpu32 (EXTNODE (tree, i)->data); break;