Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
19 changes: 19 additions & 0 deletions bssl-compat/source/err.cc
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@
#include <ossl.h>
#include <map>
#include <string>
#include <cstring>


uint64_t o2b(uint64_t e) {
Expand Down Expand Up @@ -71,6 +72,12 @@ extern "C" uint32_t ERR_get_error(void) {


extern "C" const char *ERR_lib_error_string(uint32_t packed_error) {
// Handle system library errors like BoringSSL does
// OpenSSL 3.x returns NULL for system errors, but BoringSSL returns "system library"
if (ERR_GET_LIB(packed_error) == ERR_LIB_SYS) {
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
if (ERR_GET_LIB(packed_error) == ERR_LIB_SYS) {
if (ossl_ERR_SYSTEM_ERROR(packed_error)) {

return "system library";
}

const char *ret = ossl.ossl_ERR_lib_error_string(b2o(packed_error));
return (ret ? ret : "unknown library");
}
Expand All @@ -92,6 +99,18 @@ extern "C" uint32_t ERR_peek_last_error(void) {


extern "C" const char *ERR_reason_error_string(uint32_t packed_error) {
// Handle system library errors like BoringSSL does
// For system errors, return strerror(errno) like BoringSSL does
if (ERR_GET_LIB(packed_error) == ERR_LIB_SYS) {
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
if (ERR_GET_LIB(packed_error) == ERR_LIB_SYS) {
if (ossl_ERR_SYSTEM_ERROR(packed_error)) {

uint32_t reason = ERR_GET_REASON(packed_error);
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
uint32_t reason = ERR_GET_REASON(packed_error);
uint32_t reason = ossl_ERR_GET_REASON(packed_error);

// Only use strerror for reasonable errno values (< 256)
// This matches BoringSSL's behavior which checks < 127
if (reason > 0 && reason < 256) {
return strerror(reason);
}
return NULL;
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
return NULL;
return "unknown error";

}

/**
* This is not an exhaustive list of errors; rather it is just the ones that
* need to be translated for the Envoy tests to pass (yes some of the tests do
Expand Down
64 changes: 64 additions & 0 deletions bssl-compat/source/test/test_err.cc
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,8 @@
#include <openssl/err.h>
#include <openssl/ssl.h>
#include <limits>
#include <cstring>
#include <cerrno>


TEST(ErrTest, test_ERR_func_error_string) {
Expand Down Expand Up @@ -50,3 +52,65 @@ TEST(ErrTest, test_SSL_R_NO_SUITABLE_SIGNATURE_ALGORITHM) {
EXPECT_STREQ("NO_COMMON_SIGNATURE_ALGORITHMS", ERR_reason_error_string(e));
EXPECT_STREQ("error:100000fd:SSL routines:OPENSSL_internal:NO_COMMON_SIGNATURE_ALGORITHMS", ERR_error_string_n(e, buf, sizeof(buf)));
}


TEST(ErrTest, test_system_error_ECONNRESET) {
uint32_t err = 0x80000068;

EXPECT_EQ(ERR_LIB_SYS, ERR_GET_LIB(err));
EXPECT_EQ(104, ERR_GET_REASON(err));

const char *lib = ERR_lib_error_string(err);
ASSERT_NE(nullptr, lib);
EXPECT_STREQ("system library", lib);

const char *reason = ERR_reason_error_string(err);
ASSERT_NE(nullptr, reason);
EXPECT_STREQ(strerror(104), reason);
}


TEST(ErrTest, test_system_error_EPIPE) {
uint32_t err = 0x80000020;

EXPECT_EQ(ERR_LIB_SYS, ERR_GET_LIB(err));
EXPECT_EQ(32, ERR_GET_REASON(err));

const char *lib = ERR_lib_error_string(err);
ASSERT_NE(nullptr, lib);
EXPECT_STREQ("system library", lib);

const char *reason = ERR_reason_error_string(err);
ASSERT_NE(nullptr, reason);
EXPECT_STREQ(strerror(32), reason);
}


TEST(ErrTest, test_system_error_ETIMEDOUT) {
uint32_t err = 0x8000006E;

EXPECT_EQ(ERR_LIB_SYS, ERR_GET_LIB(err));
EXPECT_EQ(110, ERR_GET_REASON(err));

const char *lib = ERR_lib_error_string(err);
ASSERT_NE(nullptr, lib);
EXPECT_STREQ("system library", lib);

const char *reason = ERR_reason_error_string(err);
ASSERT_NE(nullptr, reason);
EXPECT_STREQ(strerror(110), reason);
}


TEST(ErrTest, test_system_error_invalid_errno) {
uint32_t err = 0x80000FFF;

EXPECT_EQ(ERR_LIB_SYS, ERR_GET_LIB(err));

const char *lib = ERR_lib_error_string(err);
ASSERT_NE(nullptr, lib);
EXPECT_STREQ("system library", lib);

const char *reason = ERR_reason_error_string(err);
EXPECT_EQ(nullptr, reason);
}