diff options
Diffstat (limited to 'src/lib/libcrypto/x509/x509_constraints.c')
-rw-r--r-- | src/lib/libcrypto/x509/x509_constraints.c | 34 |
1 files changed, 21 insertions, 13 deletions
diff --git a/src/lib/libcrypto/x509/x509_constraints.c b/src/lib/libcrypto/x509/x509_constraints.c index 67cbaa6313..2d55e136d7 100644 --- a/src/lib/libcrypto/x509/x509_constraints.c +++ b/src/lib/libcrypto/x509/x509_constraints.c | |||
@@ -1,4 +1,4 @@ | |||
1 | /* $OpenBSD: x509_constraints.c,v 1.12 2020/11/25 21:17:52 tb Exp $ */ | 1 | /* $OpenBSD: x509_constraints.c,v 1.13 2021/03/12 15:53:38 tb Exp $ */ |
2 | /* | 2 | /* |
3 | * Copyright (c) 2020 Bob Beck <beck@openbsd.org> | 3 | * Copyright (c) 2020 Bob Beck <beck@openbsd.org> |
4 | * | 4 | * |
@@ -86,9 +86,16 @@ x509_constraints_name_dup(struct x509_constraints_name *name) | |||
86 | } | 86 | } |
87 | 87 | ||
88 | struct x509_constraints_names * | 88 | struct x509_constraints_names * |
89 | x509_constraints_names_new() | 89 | x509_constraints_names_new(size_t names_max) |
90 | { | 90 | { |
91 | return (calloc(1, sizeof(struct x509_constraints_names))); | 91 | struct x509_constraints_names *new; |
92 | |||
93 | if ((new = calloc(1, sizeof(struct x509_constraints_names))) == NULL) | ||
94 | return NULL; | ||
95 | |||
96 | new->names_max = names_max; | ||
97 | |||
98 | return new; | ||
92 | } | 99 | } |
93 | 100 | ||
94 | void | 101 | void |
@@ -118,6 +125,8 @@ x509_constraints_names_add(struct x509_constraints_names *names, | |||
118 | { | 125 | { |
119 | size_t i = names->names_count; | 126 | size_t i = names->names_count; |
120 | 127 | ||
128 | if (names->names_count >= names->names_max) | ||
129 | return 0; | ||
121 | if (names->names_count == names->names_len) { | 130 | if (names->names_count == names->names_len) { |
122 | struct x509_constraints_name **tmp; | 131 | struct x509_constraints_name **tmp; |
123 | if ((tmp = recallocarray(names->names, names->names_len, | 132 | if ((tmp = recallocarray(names->names, names->names_len, |
@@ -141,14 +150,16 @@ x509_constraints_names_dup(struct x509_constraints_names *names) | |||
141 | if (names == NULL) | 150 | if (names == NULL) |
142 | return NULL; | 151 | return NULL; |
143 | 152 | ||
144 | if ((new = x509_constraints_names_new()) == NULL) | 153 | if ((new = x509_constraints_names_new(names->names_max)) == NULL) |
145 | goto err; | 154 | goto err; |
155 | |||
146 | for (i = 0; i < names->names_count; i++) { | 156 | for (i = 0; i < names->names_count; i++) { |
147 | if ((name = x509_constraints_name_dup(names->names[i])) == NULL) | 157 | if ((name = x509_constraints_name_dup(names->names[i])) == NULL) |
148 | goto err; | 158 | goto err; |
149 | if (!x509_constraints_names_add(new, name)) | 159 | if (!x509_constraints_names_add(new, name)) |
150 | goto err; | 160 | goto err; |
151 | } | 161 | } |
162 | |||
152 | return new; | 163 | return new; |
153 | err: | 164 | err: |
154 | x509_constraints_names_free(new); | 165 | x509_constraints_names_free(new); |
@@ -1117,7 +1128,8 @@ x509_constraints_chain(STACK_OF(X509) *chain, int *error, int *depth) | |||
1117 | goto err; | 1128 | goto err; |
1118 | if (chain_length == 1) | 1129 | if (chain_length == 1) |
1119 | return 1; | 1130 | return 1; |
1120 | if ((names = x509_constraints_names_new()) == NULL) { | 1131 | if ((names = x509_constraints_names_new( |
1132 | X509_VERIFY_MAX_CHAIN_NAMES)) == NULL) { | ||
1121 | verify_err = X509_V_ERR_OUT_OF_MEM; | 1133 | verify_err = X509_V_ERR_OUT_OF_MEM; |
1122 | goto err; | 1134 | goto err; |
1123 | } | 1135 | } |
@@ -1130,13 +1142,13 @@ x509_constraints_chain(STACK_OF(X509) *chain, int *error, int *depth) | |||
1130 | if ((cert = sk_X509_value(chain, i)) == NULL) | 1142 | if ((cert = sk_X509_value(chain, i)) == NULL) |
1131 | goto err; | 1143 | goto err; |
1132 | if (cert->nc != NULL) { | 1144 | if (cert->nc != NULL) { |
1133 | if ((permitted = | 1145 | if ((permitted = x509_constraints_names_new( |
1134 | x509_constraints_names_new()) == NULL) { | 1146 | X509_VERIFY_MAX_CHAIN_CONSTRAINTS)) == NULL) { |
1135 | verify_err = X509_V_ERR_OUT_OF_MEM; | 1147 | verify_err = X509_V_ERR_OUT_OF_MEM; |
1136 | goto err; | 1148 | goto err; |
1137 | } | 1149 | } |
1138 | if ((excluded = | 1150 | if ((excluded = x509_constraints_names_new( |
1139 | x509_constraints_names_new()) == NULL) { | 1151 | X509_VERIFY_MAX_CHAIN_CONSTRAINTS)) == NULL) { |
1140 | verify_err = X509_V_ERR_OUT_OF_MEM; | 1152 | verify_err = X509_V_ERR_OUT_OF_MEM; |
1141 | goto err; | 1153 | goto err; |
1142 | } | 1154 | } |
@@ -1161,10 +1173,6 @@ x509_constraints_chain(STACK_OF(X509) *chain, int *error, int *depth) | |||
1161 | if (!x509_constraints_extract_names(names, cert, 0, | 1173 | if (!x509_constraints_extract_names(names, cert, 0, |
1162 | &verify_err)) | 1174 | &verify_err)) |
1163 | goto err; | 1175 | goto err; |
1164 | if (names->names_count > X509_VERIFY_MAX_CHAIN_NAMES) { | ||
1165 | verify_err = X509_V_ERR_OUT_OF_MEM; | ||
1166 | goto err; | ||
1167 | } | ||
1168 | } | 1176 | } |
1169 | 1177 | ||
1170 | x509_constraints_names_free(names); | 1178 | x509_constraints_names_free(names); |