From: Vladimir 'phcoder' Serbinenko Date: Sun, 30 Oct 2011 13:17:44 +0000 (+0100) Subject: * grub-core/fs/bfs.c: MAcroify and add some necessary sanity checks. X-Git-Tag: 2.00~1035 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=785ab8c76053d18a1b80046d599e0ed7f8680f00;p=thirdparty%2Fgrub.git * grub-core/fs/bfs.c: MAcroify and add some necessary sanity checks. --- diff --git a/ChangeLog b/ChangeLog index c52bff5b9..8ff87aebd 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,7 @@ +2011-10-30 Vladimir Serbinenko + + * grub-core/fs/bfs.c: MAcroify and add some necessary sanity checks. + 2011-10-30 Vladimir Serbinenko * grub-core/fs/bfs.c: Run indent. diff --git a/grub-core/fs/bfs.c b/grub-core/fs/bfs.c index 7b6e359ae..c16a50f39 100644 --- a/grub-core/fs/bfs.c +++ b/grub-core/fs/bfs.c @@ -146,7 +146,8 @@ read_extent (grub_disk_t disk, return grub_disk_read (disk, ((grub_bfs_to_cpu32 (in->ag) << grub_bfs_to_cpu32 (sb->log2_ag_size)) + grub_bfs_to_cpu16 (in->start) + off) - << (grub_bfs_to_cpu32 (sb->log2_bsize) - 9), byteoff, + << (grub_bfs_to_cpu32 (sb->log2_bsize) + - GRUB_DISK_SECTOR_BITS), byteoff, len, buf); } @@ -383,7 +384,8 @@ iterate_in_b_tree (grub_disk_t disk, + ALIGN_UP (sizeof (node) + grub_bfs_to_cpu16 (node.total_key_len), 8) + - grub_bfs_to_cpu16 (node.count_keys) * 2, + grub_bfs_to_cpu16 (node.count_keys) + * sizeof (grub_uint64_t), &key_value, sizeof (grub_uint64_t), 0); if (err) return 0; @@ -415,7 +417,8 @@ iterate_in_b_tree (grub_disk_t disk, grub_bfs_to_cpu16 (node. total_key_len), 8), keylen_idx, - grub_bfs_to_cpu16 (node.count_keys) * 2, 0); + grub_bfs_to_cpu16 (node.count_keys) + * sizeof (grub_uint16_t), 0); if (err) return 0; err = read_bfs_file (disk, sb, ino, node_off @@ -423,9 +426,11 @@ iterate_in_b_tree (grub_disk_t disk, grub_bfs_to_cpu16 (node. total_key_len), 8) + - grub_bfs_to_cpu16 (node.count_keys) * 2, + grub_bfs_to_cpu16 (node.count_keys) + * sizeof (grub_uint16_t), key_values, - grub_bfs_to_cpu16 (node.count_keys) * 8, 0); + grub_bfs_to_cpu16 (node.count_keys) + * sizeof (grub_uint64_t), 0); if (err) return 0; @@ -434,6 +439,8 @@ iterate_in_b_tree (grub_disk_t disk, char c; start = end; end = grub_bfs_to_cpu16 (keylen_idx[i]); + if (grub_bfs_to_cpu16 (node.total_key_len) <= end) + end = grub_bfs_to_cpu16 (node.total_key_len); c = key_data[end]; key_data[end] = 0; if (hook (key_data + start, grub_bfs_to_cpu64 (key_values[i]))) @@ -490,7 +497,8 @@ find_in_b_tree (grub_disk_t disk, ALIGN_UP (sizeof (node) + grub_bfs_to_cpu16 (node.total_key_len), 8), keylen_idx, - grub_bfs_to_cpu16 (node.count_keys) * 2, 0); + grub_bfs_to_cpu16 (node.count_keys) + * sizeof (grub_uint16_t), 0); if (err) return err; err = read_bfs_file (disk, sb, ino, node_off @@ -498,9 +506,11 @@ find_in_b_tree (grub_disk_t disk, grub_bfs_to_cpu16 (node. total_key_len), 8) + - grub_bfs_to_cpu16 (node.count_keys) * 2, + grub_bfs_to_cpu16 (node.count_keys) + * sizeof (grub_uint16_t), key_values, - grub_bfs_to_cpu16 (node.count_keys) * 8, 0); + grub_bfs_to_cpu16 (node.count_keys) + * sizeof (grub_uint64_t), 0); if (err) return err; @@ -561,7 +571,8 @@ hop_level (grub_disk_t disk, return err; return grub_disk_read (disk, res - << (grub_bfs_to_cpu32 (sb->log2_bsize) - 9), 0, + << (grub_bfs_to_cpu32 (sb->log2_bsize) + - GRUB_DISK_SECTOR_BITS), 0, grub_bfs_to_cpu32 (sb->bsize), (char *) ino); } @@ -718,7 +729,8 @@ grub_bfs_dir (grub_device_t device, const char *path, struct grub_dirhook_info info; err2 = grub_disk_read (device->disk, value - << (grub_bfs_to_cpu32 (sb.log2_bsize) - 9), 0, + << (grub_bfs_to_cpu32 (sb.log2_bsize) + - GRUB_DISK_SECTOR_BITS), 0, grub_bfs_to_cpu32 (sb.bsize), (char *) ino.raw); if (err2) { @@ -877,7 +889,8 @@ read_bfs_attr (grub_disk_t disk, if (err) return -1; grub_disk_read (disk, res - << (grub_bfs_to_cpu32 (sb->log2_bsize) - 9), 0, + << (grub_bfs_to_cpu32 (sb->log2_bsize) + - GRUB_DISK_SECTOR_BITS), 0, grub_bfs_to_cpu32 (sb->bsize), (char *) &ino2); read = grub_bfs_to_cpu64 (ino2.ino.size); if (read > len) @@ -916,7 +929,7 @@ grub_bfs_uuid (grub_device_t device, char **uuid) if (err) return err; if (read_bfs_attr (device->disk, &sb, &ino.ino, "be:volume_id", - &vid, 8) == 8) + &vid, sizeof (vid)) == sizeof (vid)) *uuid = grub_xasprintf ("%016" PRIxGRUB_UINT64_T, grub_bfs_to_cpu64 (vid)); }