diff options
author | Dimitri Staessens <[email protected]> | 2019-10-16 20:15:56 +0200 |
---|---|---|
committer | Sander Vrijders <[email protected]> | 2019-10-28 19:48:49 +0100 |
commit | 80eb05876f302ef713556637a54bf82c00506139 (patch) | |
tree | 6e675f6a07c6df3e4ba2455611638a5d41ae77c2 /src/lib | |
parent | c0ea8b9c98e81f513ae3eaa2f2bf7f47fe528582 (diff) | |
download | ouroboros-80eb05876f302ef713556637a54bf82c00506139.tar.gz ouroboros-80eb05876f302ef713556637a54bf82c00506139.zip |
lib: Clean up fail path in constructors
The node construction path is revised using gotos to avoid repetition.
Signed-off-by: Dimitri Staessens <[email protected]>
Signed-off-by: Sander Vrijders <[email protected]>
Diffstat (limited to 'src/lib')
-rw-r--r-- | src/lib/btree.c | 32 |
1 files changed, 17 insertions, 15 deletions
diff --git a/src/lib/btree.c b/src/lib/btree.c index 0b5a80d0..c8c71bfd 100644 --- a/src/lib/btree.c +++ b/src/lib/btree.c @@ -83,22 +83,17 @@ static struct btnode * btnode_create(size_t k) node = malloc(sizeof(*node)); if (node == NULL) - return NULL; + goto fail_node; assert(k > 0); node->keyvals = malloc(sizeof(*node->keyvals) * k); - if (node->keyvals == NULL) { - free(node); - return NULL; - } + if (node->keyvals == NULL) + goto fail_keyvals; node->children = malloc(sizeof(*node->children) * (k + 1)); - if (node->children == NULL) { - free(node->keyvals); - free(node); - return NULL; - } + if (node->children == NULL) + goto fail_children; for (i = 0; i < k; ++i) { node->children[i] = NULL; @@ -111,6 +106,13 @@ static struct btnode * btnode_create(size_t k) node->leaf = true; return node; + + fail_children: + free(node->keyvals); + fail_keyvals: + free(node); + fail_node: + return NULL; } static void btnode_destroy(struct btnode * node) @@ -366,14 +368,14 @@ static int btnode_delete(struct btnode * node, struct btree * btree_create(size_t k) { - struct btree * tree = malloc(sizeof(*tree)); - if (tree == NULL) + struct btree * tree; + + if (k < 1 || k > BTREE_MAX_ORDER) return NULL; - if (k < 1 || k > BTREE_MAX_ORDER) { - free(tree); + tree = malloc(sizeof(*tree)); + if (tree == NULL) return NULL; - } tree->k = k; tree->root = NULL; |