aboutsummaryrefslogtreecommitdiff
path: root/ssl
diff options
context:
space:
mode:
authorPauli <paul.dale@oracle.com>2017-09-19 08:48:14 +1000
committerPauli <paul.dale@oracle.com>2017-09-28 06:53:40 +1000
commite431363f8c241abd0dfe9b83dfc1cec1bdfe13ab (patch)
tree1f4d44a49ed133216ac06b19d8e9b3c37e0b6b3c /ssl
parent1b3e2bbf64b96f636277ca29b31ba152c1831e74 (diff)
downloadopenssl-e431363f8c241abd0dfe9b83dfc1cec1bdfe13ab.zip
openssl-e431363f8c241abd0dfe9b83dfc1cec1bdfe13ab.tar.gz
openssl-e431363f8c241abd0dfe9b83dfc1cec1bdfe13ab.tar.bz2
Add stack space reservations.
Reviewed-by: Andy Polyakov <appro@openssl.org> (Merged from https://github.com/openssl/openssl/pull/4386)
Diffstat (limited to 'ssl')
-rw-r--r--ssl/ssl_cert.c8
-rw-r--r--ssl/ssl_lib.c4
2 files changed, 9 insertions, 3 deletions
diff --git a/ssl/ssl_cert.c b/ssl/ssl_cert.c
index ba5fb65..a517cf1 100644
--- a/ssl/ssl_cert.c
+++ b/ssl/ssl_cert.c
@@ -460,6 +460,7 @@ static void set0_CA_list(STACK_OF(X509_NAME) **ca_list,
STACK_OF(X509_NAME) *SSL_dup_CA_list(const STACK_OF(X509_NAME) *sk)
{
int i;
+ const int num = sk_X509_NAME_num(sk);
STACK_OF(X509_NAME) *ret;
X509_NAME *name;
@@ -468,13 +469,16 @@ STACK_OF(X509_NAME) *SSL_dup_CA_list(const STACK_OF(X509_NAME) *sk)
SSLerr(SSL_F_SSL_DUP_CA_LIST, ERR_R_MALLOC_FAILURE);
return NULL;
}
- for (i = 0; i < sk_X509_NAME_num(sk); i++) {
+ if (!sk_X509_NAME_reserve(ret, num))
+ return NULL;
+ for (i = 0; i < num; i++) {
name = X509_NAME_dup(sk_X509_NAME_value(sk, i));
- if (name == NULL || !sk_X509_NAME_push(ret, name)) {
+ if (name == NULL) {
sk_X509_NAME_pop_free(ret, X509_NAME_free);
X509_NAME_free(name);
return NULL;
}
+ sk_X509_NAME_push(ret, name); /* Cannot fail after reserve call */
}
return (ret);
}
diff --git a/ssl/ssl_lib.c b/ssl/ssl_lib.c
index e04feec..85425a1 100644
--- a/ssl/ssl_lib.c
+++ b/ssl/ssl_lib.c
@@ -161,6 +161,7 @@ static int ssl_dane_dup(SSL *to, SSL *from)
if (!DANETLS_ENABLED(&from->dane))
return 1;
+ num = sk_danetls_record_num(from->dane.trecs);
dane_final(&to->dane);
to->dane.flags = from->dane.flags;
to->dane.dctx = &to->ctx->dane;
@@ -170,8 +171,9 @@ static int ssl_dane_dup(SSL *to, SSL *from)
SSLerr(SSL_F_SSL_DANE_DUP, ERR_R_MALLOC_FAILURE);
return 0;
}
+ if (!sk_danetls_record_reserve(to->dane.trecs, num))
+ return 0;
- num = sk_danetls_record_num(from->dane.trecs);
for (i = 0; i < num; ++i) {
danetls_record *t = sk_danetls_record_value(from->dane.trecs, i);