diff options
author | Sumit Bose <sbose@redhat.com> | 2017-09-06 12:20:25 +0200 |
---|---|---|
committer | Jakub Hrozek <jhrozek@redhat.com> | 2017-09-14 16:57:04 +0200 |
commit | f5a8cd60c6f377af1954b58f007d16cf3f6dc846 (patch) | |
tree | 526a4f23b9965f40b50e43e4d632287df6f6dc11 /src | |
parent | c20a9efbf5da0587fbb6a855a2d366ce19f1abe1 (diff) | |
download | sssd-f5a8cd60c6f377af1954b58f007d16cf3f6dc846.tar.gz sssd-f5a8cd60c6f377af1954b58f007d16cf3f6dc846.tar.xz sssd-f5a8cd60c6f377af1954b58f007d16cf3f6dc846.zip |
certmap: make sure eku_oid_list is always allocated
If there are only OIDs in a <EKU> part of a matching rule a NULL pointer
dereference might occur.
Related to https://pagure.io/SSSD/sssd/issue/3508
Reviewed-by: Lukáš Slebodník <lslebodn@redhat.com>
Reviewed-by: Jakub Hrozek <jhrozek@redhat.com>
Diffstat (limited to 'src')
-rw-r--r-- | src/lib/certmap/sss_certmap_krb5_match.c | 21 | ||||
-rw-r--r-- | src/tests/cmocka/test_certmap.c | 17 |
2 files changed, 29 insertions, 9 deletions
diff --git a/src/lib/certmap/sss_certmap_krb5_match.c b/src/lib/certmap/sss_certmap_krb5_match.c index 0cd339387..125e925d9 100644 --- a/src/lib/certmap/sss_certmap_krb5_match.c +++ b/src/lib/certmap/sss_certmap_krb5_match.c @@ -180,19 +180,17 @@ static int parse_krb5_get_eku_value(TALLOC_CTX *mem_ctx, goto done; } + comp->eku_oid_list = talloc_zero_array(comp, const char *, + eku_list_size + 1); + if (comp->eku_oid_list == NULL) { + ret = ENOMEM; + goto done; + } + for (c = 0; eku_list[c] != NULL; c++) { for (k = 0; ext_key_usage[k].name != NULL; k++) { CM_DEBUG(ctx, "[%s][%s].", eku_list[c], ext_key_usage[k].name); if (strcasecmp(eku_list[c], ext_key_usage[k].name) == 0) { - if (comp->eku_oid_list == NULL) { - comp->eku_oid_list = talloc_zero_array(comp, const char *, - eku_list_size + 1); - if (comp->eku_oid_list == NULL) { - ret = ENOMEM; - goto done; - } - } - comp->eku_oid_list[e] = talloc_strdup(comp->eku_oid_list, ext_key_usage[k].oid); if (comp->eku_oid_list[e] == NULL) { @@ -226,6 +224,11 @@ CM_DEBUG(ctx, "[%s][%s].", eku_list[c], ext_key_usage[k].name); } } + if (e == 0) { + talloc_free(comp->eku_oid_list); + comp->eku_oid_list = NULL; + } + ret = 0; done: diff --git a/src/tests/cmocka/test_certmap.c b/src/tests/cmocka/test_certmap.c index f1e73875b..6ab310326 100644 --- a/src/tests/cmocka/test_certmap.c +++ b/src/tests/cmocka/test_certmap.c @@ -449,6 +449,23 @@ static void test_sss_certmap_add_matching_rule(void **state) assert_null( ctx->prio_list->rule_list->parsed_match_rule->eku->eku_oid_list[3]); + ret = sss_certmap_add_rule(ctx, 96, + "KRB5:<EKU>1.2.3", + NULL, NULL); + assert_int_equal(ret, 0); + assert_non_null(ctx->prio_list); + assert_non_null(ctx->prio_list->rule_list); + assert_non_null(ctx->prio_list->rule_list->parsed_match_rule); + assert_int_equal(ctx->prio_list->rule_list->parsed_match_rule->r, + relation_and); + assert_non_null(ctx->prio_list->rule_list->parsed_match_rule->eku); + assert_true(string_in_list("1.2.3", + discard_const( + ctx->prio_list->rule_list->parsed_match_rule->eku->eku_oid_list), + true)); + assert_null( + ctx->prio_list->rule_list->parsed_match_rule->eku->eku_oid_list[1]); + /* SAN tests */ ret = sss_certmap_add_rule(ctx, 89, "KRB5:<SAN>abc", NULL, NULL); assert_int_equal(ret, 0); |