Skip to content

Commit 58c2dd8

Browse files
dgntedjpoole
authored andcommitted
fix system library error messages
previously, we'd log a lot of "unknown" error messages. this should fix that. Signed-off-by: Daniel Grimm <dgrimm@redhat.com> Signed-off-by: Ted Poole <tpoole@redhat.com>
1 parent 3cb33a0 commit 58c2dd8

File tree

2 files changed

+83
-0
lines changed

2 files changed

+83
-0
lines changed

bssl-compat/source/err.cc

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
#include <ossl.h>
33
#include <map>
44
#include <string>
5+
#include <cstring>
56

67

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

7273

7374
extern "C" const char *ERR_lib_error_string(uint32_t packed_error) {
75+
// Handle system library errors like BoringSSL does
76+
// OpenSSL 3.x returns NULL for system errors, but BoringSSL returns "system library"
77+
if (ossl_ERR_SYSTEM_ERROR(packed_error)) {
78+
return "system library";
79+
}
80+
7481
const char *ret = ossl.ossl_ERR_lib_error_string(b2o(packed_error));
7582
return (ret ? ret : "unknown library");
7683
}
@@ -92,6 +99,18 @@ extern "C" uint32_t ERR_peek_last_error(void) {
9299

93100

94101
extern "C" const char *ERR_reason_error_string(uint32_t packed_error) {
102+
// Handle system library errors like BoringSSL does
103+
// For system errors, return strerror(errno) like BoringSSL does
104+
if (ossl_ERR_SYSTEM_ERROR(packed_error)) {
105+
uint32_t reason = ossl_ERR_GET_REASON(packed_error);
106+
// Only use strerror for reasonable errno values (< 134)
107+
// BoringSSL checks < 127, but Linux has valid errno values up to 133
108+
if (reason > 0 && reason < 134) {
109+
return strerror(reason);
110+
}
111+
return "unknown error";
112+
}
113+
95114
/**
96115
* This is not an exhaustive list of errors; rather it is just the ones that
97116
* need to be translated for the Envoy tests to pass (yes some of the tests do

bssl-compat/source/test/test_err.cc

Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@
22
#include <openssl/err.h>
33
#include <openssl/ssl.h>
44
#include <limits>
5+
#include <cstring>
6+
#include <cerrno>
57

68

79
TEST(ErrTest, test_ERR_func_error_string) {
@@ -50,3 +52,65 @@ TEST(ErrTest, test_SSL_R_NO_SUITABLE_SIGNATURE_ALGORITHM) {
5052
EXPECT_STREQ("NO_COMMON_SIGNATURE_ALGORITHMS", ERR_reason_error_string(e));
5153
EXPECT_STREQ("error:100000fd:SSL routines:OPENSSL_internal:NO_COMMON_SIGNATURE_ALGORITHMS", ERR_error_string_n(e, buf, sizeof(buf)));
5254
}
55+
56+
57+
TEST(ErrTest, test_system_error_ECONNRESET) {
58+
uint32_t err = 0x80000068;
59+
60+
EXPECT_EQ(ERR_LIB_SYS, ERR_GET_LIB(err));
61+
EXPECT_EQ(104, ERR_GET_REASON(err));
62+
63+
const char *lib = ERR_lib_error_string(err);
64+
ASSERT_NE(nullptr, lib);
65+
EXPECT_STREQ("system library", lib);
66+
67+
const char *reason = ERR_reason_error_string(err);
68+
ASSERT_NE(nullptr, reason);
69+
EXPECT_STREQ(strerror(104), reason);
70+
}
71+
72+
73+
TEST(ErrTest, test_system_error_EPIPE) {
74+
uint32_t err = 0x80000020;
75+
76+
EXPECT_EQ(ERR_LIB_SYS, ERR_GET_LIB(err));
77+
EXPECT_EQ(32, ERR_GET_REASON(err));
78+
79+
const char *lib = ERR_lib_error_string(err);
80+
ASSERT_NE(nullptr, lib);
81+
EXPECT_STREQ("system library", lib);
82+
83+
const char *reason = ERR_reason_error_string(err);
84+
ASSERT_NE(nullptr, reason);
85+
EXPECT_STREQ(strerror(32), reason);
86+
}
87+
88+
89+
TEST(ErrTest, test_system_error_ETIMEDOUT) {
90+
uint32_t err = 0x8000006E;
91+
92+
EXPECT_EQ(ERR_LIB_SYS, ERR_GET_LIB(err));
93+
EXPECT_EQ(110, ERR_GET_REASON(err));
94+
95+
const char *lib = ERR_lib_error_string(err);
96+
ASSERT_NE(nullptr, lib);
97+
EXPECT_STREQ("system library", lib);
98+
99+
const char *reason = ERR_reason_error_string(err);
100+
ASSERT_NE(nullptr, reason);
101+
EXPECT_STREQ(strerror(110), reason);
102+
}
103+
104+
105+
TEST(ErrTest, test_system_error_invalid_errno) {
106+
uint32_t err = 0x80000FFF;
107+
108+
EXPECT_EQ(ERR_LIB_SYS, ERR_GET_LIB(err));
109+
110+
const char *lib = ERR_lib_error_string(err);
111+
ASSERT_NE(nullptr, lib);
112+
EXPECT_STREQ("system library", lib);
113+
114+
const char *reason = ERR_reason_error_string(err);
115+
EXPECT_EQ(nullptr, reason);
116+
}

0 commit comments

Comments
 (0)