From 2b6dd2e579a34c1a50214f0ae0aa7e61135d657d Mon Sep 17 00:00:00 2001 From: Subodh Iyengar Date: Fri, 13 May 2016 00:24:05 -0700 Subject: [PATCH] Fix extra bytes in err message Summary: Error message might be < 256 bytes in which case buf.size() would be greater than the size of the message written out and we might have garbled bytes at the end. ERR_error_string_n null terminates the string so just use that. Reviewed By: anirudhvr Differential Revision: D3297320 fbshipit-source-id: 2ae626ce4c49ca478806c0bcc40a390e5a84f24b --- folly/io/async/ssl/SSLErrors.cpp | 3 +- folly/io/async/ssl/test/SSLErrorsTest.cpp | 39 +++++++++++++++++++++++ 2 files changed, 41 insertions(+), 1 deletion(-) create mode 100644 folly/io/async/ssl/test/SSLErrorsTest.cpp diff --git a/folly/io/async/ssl/SSLErrors.cpp b/folly/io/async/ssl/SSLErrors.cpp index ebc5d3d0..61987aed 100644 --- a/folly/io/async/ssl/SSLErrors.cpp +++ b/folly/io/async/ssl/SSLErrors.cpp @@ -40,7 +40,8 @@ std::string decodeOpenSSLError( } else { std::array buf; ERR_error_string_n(errError, buf.data(), buf.size()); - return std::string(buf.data(), buf.size()); + // OpenSSL will null terminate the string. + return std::string(buf.data()); } } diff --git a/folly/io/async/ssl/test/SSLErrorsTest.cpp b/folly/io/async/ssl/test/SSLErrorsTest.cpp new file mode 100644 index 00000000..f651acea --- /dev/null +++ b/folly/io/async/ssl/test/SSLErrorsTest.cpp @@ -0,0 +1,39 @@ +/* + * Copyright 2016 Facebook, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include + +#include +#include +#include + +using namespace testing; +using namespace folly; + +TEST(SSLErrorsTest, TestMessage) { + ERR_load_crypto_strings(); + auto err = ERR_PACK( + ERR_LIB_X509, + X509_F_X509_STORE_ADD_CERT, + X509_R_CERT_ALREADY_IN_HASH_TABLE); + SSLException ex(0, err, 0, 0); + std::string expectedMsg = + "AsyncSocketException: error:0B07C065:" + "x509 certificate routines:X509_STORE_add_cert:" + "cert already in hash table, type = SSL error"; + std::string actual = ex.what(); + EXPECT_EQ(expectedMsg, actual); +} -- 2.34.1