Skip to content

Commit

Permalink
x509: Handle ossl_policy_level_add_node errors
Browse files Browse the repository at this point in the history
The invocation of ossl_policy_level_add_node in tree_calculate_user_set
did not have any error handling. Add it to prevent a memory leak for the
allocated extra policy data.

Also add error handling to sk_X509_POLICY_NODE_push to ensure that if
a new node was allocated, but could not be added to the stack, it is
freed correctly.

Fix error handling if tree->user_policies cannot be allocated by
returning 0, indicating failure, rather than 1.

Signed-off-by: Clemens Lang <cllang@redhat.com>

Reviewed-by: Dmitry Belyavskiy <beldmit@gmail.com>
Reviewed-by: Matt Caswell <matt@openssl.org>
Reviewed-by: Bernd Edlinger <bernd.edlinger@hotmail.de>
Reviewed-by: Tomas Mraz <tomas@openssl.org>
(Merged from #21040)

(cherry picked from commit 95a8aa6)
  • Loading branch information
neverpanic authored and t8m committed May 29, 2023
1 parent cebcb91 commit 3ecfc9e
Showing 1 changed file with 13 additions and 3 deletions.
16 changes: 13 additions & 3 deletions crypto/x509/pcy_tree.c
Expand Up @@ -25,6 +25,8 @@
# define OPENSSL_POLICY_TREE_NODES_MAX 1000
#endif

static void exnode_free(X509_POLICY_NODE *node);

static void expected_print(BIO *channel,
X509_POLICY_LEVEL *lev, X509_POLICY_NODE *node,
int indent)
Expand Down Expand Up @@ -570,14 +572,22 @@ static int tree_calculate_user_set(X509_POLICY_TREE *tree,
| POLICY_DATA_FLAG_EXTRA_NODE;
node = ossl_policy_level_add_node(NULL, extra, anyPolicy->parent,
tree, 1);
if (node == NULL) {
ossl_policy_data_free(extra);
return 0;
}
}
if (!tree->user_policies) {
tree->user_policies = sk_X509_POLICY_NODE_new_null();
if (!tree->user_policies)
return 1;
if (!tree->user_policies) {
exnode_free(node);
return 0;
}
}
if (!sk_X509_POLICY_NODE_push(tree->user_policies, node))
if (!sk_X509_POLICY_NODE_push(tree->user_policies, node)) {
exnode_free(node);
return 0;
}
}
return 1;
}
Expand Down

0 comments on commit 3ecfc9e

Please sign in to comment.