From: Daniel Axtens Date: Mon, 18 Jan 2021 06:06:19 +0000 (+1100) Subject: fs/nilfs2: Properly bail on errors in grub_nilfs2_btree_node_lookup() X-Git-Tag: grub-2.06-rc1~62 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=ca5d9ac206043b1fb4cb06259272fb1c5946bb6d;p=thirdparty%2Fgrub.git fs/nilfs2: Properly bail on errors in grub_nilfs2_btree_node_lookup() We just introduced an error return in grub_nilfs2_btree_node_lookup(). Make sure the callers catch it. At the same time, make sure that grub_nilfs2_btree_node_lookup() always inits the index pointer passed to it. Signed-off-by: Daniel Axtens Reviewed-by: Daniel Kiper --- diff --git a/grub-core/fs/nilfs2.c b/grub-core/fs/nilfs2.c index 7963b4ef5..9b76982b3 100644 --- a/grub-core/fs/nilfs2.c +++ b/grub-core/fs/nilfs2.c @@ -433,7 +433,7 @@ grub_nilfs2_btree_node_lookup (struct grub_nilfs2_data *data, grub_uint64_t key, int *indexp) { grub_uint64_t nkey; - int index, low, high, s; + int index = 0, low, high, s; low = 0; @@ -441,10 +441,10 @@ grub_nilfs2_btree_node_lookup (struct grub_nilfs2_data *data, if (high >= grub_nilfs2_btree_node_nchildren_max (data, node)) { grub_error (GRUB_ERR_BAD_FS, "too many children"); + *indexp = index; return 0; } - index = 0; s = 0; while (low <= high) { @@ -526,6 +526,10 @@ grub_nilfs2_btree_lookup (struct grub_nilfs2_data *data, level = grub_nilfs2_btree_get_level (node); found = grub_nilfs2_btree_node_lookup (data, node, key, &index); + + if (grub_errno != GRUB_ERR_NONE) + goto fail; + ptr = grub_nilfs2_btree_node_get_ptr (data, node, index); if (need_translate) ptr = grub_nilfs2_dat_translate (data, ptr); @@ -550,7 +554,8 @@ grub_nilfs2_btree_lookup (struct grub_nilfs2_data *data, else index = 0; - if (index < grub_nilfs2_btree_node_nchildren_max (data, node)) + if (index < grub_nilfs2_btree_node_nchildren_max (data, node) && + grub_errno == GRUB_ERR_NONE) { ptr = grub_nilfs2_btree_node_get_ptr (data, node, index); if (need_translate)