From 6e9321f9ae325006dd04ed87d9c3367752abd5f5 Mon Sep 17 00:00:00 2001 From: David Benjamin Date: Tue, 25 Jul 2017 23:49:58 -0400 Subject: [PATCH] Add a bssl::PushToStack helper. Pushing entries onto a stack when handling malloc failures is a nuisance. sk_push only takes ownership on success. PushToStack smooths that over with a UniquePtr. Bug: 132 Change-Id: I4f0a9eee86dda7453f128c33d3a71b550beb25e9 Reviewed-on: https://boringssl-review.googlesource.com/18468 Reviewed-by: David Benjamin Commit-Queue: David Benjamin --- include/openssl/stack.h | 15 +++++++++++++++ ssl/tls13_both.cc | 9 ++++----- 2 files changed, 19 insertions(+), 5 deletions(-) diff --git a/include/openssl/stack.h b/include/openssl/stack.h index 0e59d6a5..3626fb0a 100644 --- a/include/openssl/stack.h +++ b/include/openssl/stack.h @@ -450,6 +450,21 @@ using StackIterator = typename std::enable_if::kIsStack, } // namespace internal +// PushToStack pushes |elem| to |sk|. It returns true on success and false on +// allocation failure. +template +static inline + typename std::enable_if::kIsConst, bool>::type + PushToStack(Stack *sk, + UniquePtr::Type> elem) { + if (!sk_push(reinterpret_cast<_STACK *>(sk), elem.get())) { + return false; + } + // sk_push takes ownership on success. + elem.release(); + return true; +} + } // namespace bssl // Define begin() and end() for stack types so C++ range for loops work. diff --git a/ssl/tls13_both.cc b/ssl/tls13_both.cc index 627f0388..a5b9c53f 100644 --- a/ssl/tls13_both.cc +++ b/ssl/tls13_both.cc @@ -245,11 +245,10 @@ int tls13_process_certificate(SSL_HANDSHAKE *hs, int allow_anonymous) { } } - CRYPTO_BUFFER *buf = - CRYPTO_BUFFER_new_from_CBS(&certificate, ssl->ctx->pool); - if (buf == NULL || - !sk_CRYPTO_BUFFER_push(certs.get(), buf)) { - CRYPTO_BUFFER_free(buf); + UniquePtr buf( + CRYPTO_BUFFER_new_from_CBS(&certificate, ssl->ctx->pool)); + if (!buf || + !PushToStack(certs.get(), std::move(buf))) { ssl3_send_alert(ssl, SSL3_AL_FATAL, SSL_AD_INTERNAL_ERROR); OPENSSL_PUT_ERROR(SSL, ERR_R_MALLOC_FAILURE); return 0;