Skip to content

Commit aa8470e

Browse files
src: improve SSL version extraction logic
The openssl version as defined in ssl libraries is complex. The current logic to extract the major.minor.patch format uses C semantics to loop through the text and search for specific patterns. Use C++ string to tidy it up.
1 parent 2b29df7 commit aa8470e

File tree

3 files changed

+16
-38
lines changed

3 files changed

+16
-38
lines changed

src/node.cc

+5-38
Original file line numberDiff line numberDiff line change
@@ -237,24 +237,7 @@ class NodeTraceStateObserver :
237237
trace_process->SetString("napi", node_napi_version);
238238

239239
#if HAVE_OPENSSL
240-
// Stupid code to slice out the version string.
241-
{ // NOLINT(whitespace/braces)
242-
size_t i, j, k;
243-
int c;
244-
for (i = j = 0, k = sizeof(OPENSSL_VERSION_TEXT) - 1; i < k; ++i) {
245-
c = OPENSSL_VERSION_TEXT[i];
246-
if ('0' <= c && c <= '9') {
247-
for (j = i + 1; j < k; ++j) {
248-
c = OPENSSL_VERSION_TEXT[j];
249-
if (c == ' ')
250-
break;
251-
}
252-
break;
253-
}
254-
}
255-
trace_process->SetString("openssl",
256-
std::string(&OPENSSL_VERSION_TEXT[i], j - i));
257-
}
240+
trace_process->SetString("openssl", crypto::GetOpenSSLVersion());
258241
#endif
259242
trace_process->EndDictionary();
260243

@@ -1764,26 +1747,10 @@ void SetupProcessObject(Environment* env,
17641747
FIXED_ONE_BYTE_STRING(env->isolate(), node_napi_version));
17651748

17661749
#if HAVE_OPENSSL
1767-
// Stupid code to slice out the version string.
1768-
{ // NOLINT(whitespace/braces)
1769-
size_t i, j, k;
1770-
int c;
1771-
for (i = j = 0, k = sizeof(OPENSSL_VERSION_TEXT) - 1; i < k; ++i) {
1772-
c = OPENSSL_VERSION_TEXT[i];
1773-
if ('0' <= c && c <= '9') {
1774-
for (j = i + 1; j < k; ++j) {
1775-
c = OPENSSL_VERSION_TEXT[j];
1776-
if (c == ' ')
1777-
break;
1778-
}
1779-
break;
1780-
}
1781-
}
1782-
READONLY_PROPERTY(
1783-
versions,
1784-
"openssl",
1785-
OneByteString(env->isolate(), &OPENSSL_VERSION_TEXT[i], j - i));
1786-
}
1750+
READONLY_PROPERTY(
1751+
versions,
1752+
"openssl",
1753+
OneByteString(env->isolate(), crypto::GetOpenSSLVersion().c_str()));
17871754
#endif
17881755

17891756
// process.arch

src/node_crypto.cc

+10
Original file line numberDiff line numberDiff line change
@@ -5725,6 +5725,16 @@ void Initialize(Local<Object> target,
57255725
#endif // OPENSSL_NO_SCRYPT
57265726
}
57275727

5728+
std::string GetOpenSSLVersion() {
5729+
// sample openssl version string format
5730+
// for reference: "OpenSSL 1.1.0i 14 Aug 2018"
5731+
std::string ssl(OPENSSL_VERSION_TEXT);
5732+
size_t first = ssl.find(" ");
5733+
size_t second = ssl.find(" ", first + 1);
5734+
CHECK_GT(second, first);
5735+
return ssl.substr(first + 1, second - first - 1);
5736+
}
5737+
57285738
} // namespace crypto
57295739
} // namespace node
57305740

src/node_crypto.h

+1
Original file line numberDiff line numberDiff line change
@@ -98,6 +98,7 @@ extern int VerifyCallback(int preverify_ok, X509_STORE_CTX* ctx);
9898
extern void UseExtraCaCerts(const std::string& file);
9999

100100
void InitCryptoOnce();
101+
std::string GetOpenSSLVersion();
101102

102103
class SecureContext : public BaseObject {
103104
public:

0 commit comments

Comments
 (0)