From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from smtpng3.m.smailru.net (smtpng3.m.smailru.net [94.100.177.149]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by dev.tarantool.org (Postfix) with ESMTPS id C18584696C8 for ; Fri, 14 Feb 2020 22:40:40 +0300 (MSK) From: Ilya Kosarev Date: Fri, 14 Feb 2020 22:40:32 +0300 Message-Id: In-Reply-To: References: In-Reply-To: References: Subject: [Tarantool-patches] [PATCH 2/4] b-tree: return NULL on matras_alloc fail List-Id: Tarantool development patches List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: tarantool-patches@dev.tarantool.org In bps_tree_create_leaf we use matras_alloc in case bps_tree_garbage_pop didn't work out. However it also might not succeed. Then we need to return NULL instead of dereferencing NULL pointer. Part of #3807 --- src/lib/salad/bps_tree.h | 22 ++++++++++++++++++---- 1 file changed, 18 insertions(+), 4 deletions(-) diff --git a/src/lib/salad/bps_tree.h b/src/lib/salad/bps_tree.h index d28b53f53..d71340143 100644 --- a/src/lib/salad/bps_tree.h +++ b/src/lib/salad/bps_tree.h @@ -2147,8 +2147,11 @@ bps_tree_create_leaf(struct bps_tree *tree, bps_tree_block_id_t *id) { struct bps_leaf *res = (struct bps_leaf *) bps_tree_garbage_pop(tree, id); - if (!res) - res = (struct bps_leaf *)matras_alloc(&tree->matras, id); + if (!res) { + res = (struct bps_leaf *) matras_alloc(&tree->matras, id); + if (!res) + return NULL; + } res->header.type = BPS_TREE_BT_LEAF; tree->leaf_count++; return res; @@ -2162,8 +2165,11 @@ bps_tree_create_inner(struct bps_tree *tree, bps_tree_block_id_t *id) { struct bps_inner *res = (struct bps_inner *) bps_tree_garbage_pop(tree, id); - if (!res) - res = (struct bps_inner *)matras_alloc(&tree->matras, id); + if (!res) { + res = (struct bps_inner *) matras_alloc(&tree->matras, id); + if (!res) + return NULL; + } res->header.type = BPS_TREE_BT_INNER; tree->inner_count++; return res; @@ -3472,6 +3478,8 @@ bps_tree_process_insert_leaf(struct bps_tree *tree, } bps_tree_block_id_t new_block_id = (bps_tree_block_id_t)(-1); struct bps_leaf *new_leaf = bps_tree_create_leaf(tree, &new_block_id); + if (!new_leaf) + return -1; leaf_path_elem->block = (struct bps_leaf *) bps_tree_touch_block(tree, leaf_path_elem->block_id); @@ -3710,6 +3718,8 @@ bps_tree_process_insert_leaf(struct bps_tree *tree, bps_tree_block_id_t new_root_id = (bps_tree_block_id_t)(-1); struct bps_inner *new_root = bps_tree_create_inner(tree, &new_root_id); + if (!new_root) + return -1; new_root->header.size = 2; new_root->child_ids[0] = tree->root_id; new_root->child_ids[1] = new_block_id; @@ -3835,6 +3845,8 @@ bps_tree_process_insert_inner(struct bps_tree *tree, bps_tree_block_id_t new_block_id = (bps_tree_block_id_t)(-1); struct bps_inner *new_inner = bps_tree_create_inner(tree, &new_block_id); + if (!new_inner) + return -1; new_inner->header.size = 0; struct bps_inner_path_elem new_path_elem; @@ -4030,6 +4042,8 @@ bps_tree_process_insert_inner(struct bps_tree *tree, bps_tree_block_id_t new_root_id = (bps_tree_block_id_t)(-1); struct bps_inner *new_root = bps_tree_create_inner(tree, &new_root_id); + if (!new_root) + return -1; new_root->header.size = 2; new_root->child_ids[0] = tree->root_id; new_root->child_ids[1] = new_block_id; -- 2.17.1