summaryrefslogtreecommitdiff
path: root/src/node_crypto_bio.cc
diff options
context:
space:
mode:
authorDavid Benjamin <davidben@google.com>2017-09-14 19:44:06 -0400
committerRod Vagg <rod@vagg.org>2017-11-11 20:42:49 +1100
commit9f91427ad66fef08b2dcd872c9052221c8cdf8f5 (patch)
tree5e773fdde50fcbfeba42126fc250ee77af521041 /src/node_crypto_bio.cc
parent8d254c98bb7adc9ace360c95a04481a7842ff39e (diff)
downloadandroid-node-v8-9f91427ad66fef08b2dcd872c9052221c8cdf8f5.tar.gz
android-node-v8-9f91427ad66fef08b2dcd872c9052221c8cdf8f5.tar.bz2
android-node-v8-9f91427ad66fef08b2dcd872c9052221c8cdf8f5.zip
crypto: make node_crypto_bio compat w/ OpenSSL 1.1
This is cherry-picked from PR #8491 and then tidied up. The original had an unnecessarily large diff and messed up some public/private bits. PR-URL: https://github.com/nodejs/node/pull/16130 Reviewed-By: Ben Noordhuis <info@bnoordhuis.nl> Reviewed-By: Rod Vagg <rod@vagg.org>
Diffstat (limited to 'src/node_crypto_bio.cc')
-rw-r--r--src/node_crypto_bio.cc91
1 files changed, 64 insertions, 27 deletions
diff --git a/src/node_crypto_bio.cc b/src/node_crypto_bio.cc
index eb1399f0bf..eb0500952b 100644
--- a/src/node_crypto_bio.cc
+++ b/src/node_crypto_bio.cc
@@ -28,24 +28,20 @@
namespace node {
namespace crypto {
-const BIO_METHOD NodeBIO::method = {
- BIO_TYPE_MEM,
- "node.js SSL buffer",
- NodeBIO::Write,
- NodeBIO::Read,
- NodeBIO::Puts,
- NodeBIO::Gets,
- NodeBIO::Ctrl,
- NodeBIO::New,
- NodeBIO::Free,
- nullptr
-};
+#if OPENSSL_VERSION_NUMBER < 0x10100000L
+#define BIO_set_data(bio, data) bio->ptr = data
+#define BIO_get_data(bio) bio->ptr
+#define BIO_set_shutdown(bio, shutdown_) bio->shutdown = shutdown_
+#define BIO_get_shutdown(bio) bio->shutdown
+#define BIO_set_init(bio, init_) bio->init = init_
+#define BIO_get_init(bio) bio->init
+#endif
BIO* NodeBIO::New() {
// The const_cast doesn't violate const correctness. OpenSSL's usage of
// BIO_METHOD is effectively const but BIO_new() takes a non-const argument.
- return BIO_new(const_cast<BIO_METHOD*>(&method));
+ return BIO_new(const_cast<BIO_METHOD*>(GetMethod()));
}
@@ -70,12 +66,11 @@ void NodeBIO::AssignEnvironment(Environment* env) {
int NodeBIO::New(BIO* bio) {
- bio->ptr = new NodeBIO();
+ BIO_set_data(bio, new NodeBIO());
// XXX Why am I doing it?!
- bio->shutdown = 1;
- bio->init = 1;
- bio->num = -1;
+ BIO_set_shutdown(bio, 1);
+ BIO_set_init(bio, 1);
return 1;
}
@@ -85,10 +80,10 @@ int NodeBIO::Free(BIO* bio) {
if (bio == nullptr)
return 0;
- if (bio->shutdown) {
- if (bio->init && bio->ptr != nullptr) {
+ if (BIO_get_shutdown(bio)) {
+ if (BIO_get_init(bio) && BIO_get_data(bio) != nullptr) {
delete FromBIO(bio);
- bio->ptr = nullptr;
+ BIO_set_data(bio, nullptr);
}
}
@@ -97,13 +92,13 @@ int NodeBIO::Free(BIO* bio) {
int NodeBIO::Read(BIO* bio, char* out, int len) {
- int bytes;
BIO_clear_retry_flags(bio);
- bytes = FromBIO(bio)->Read(out, len);
+ NodeBIO* nbio = FromBIO(bio);
+ int bytes = nbio->Read(out, len);
if (bytes == 0) {
- bytes = bio->num;
+ bytes = nbio->eof_return();
if (bytes != 0) {
BIO_set_retry_read(bio);
}
@@ -161,7 +156,7 @@ int NodeBIO::Puts(BIO* bio, const char* str) {
int NodeBIO::Gets(BIO* bio, char* out, int size) {
- NodeBIO* nbio = FromBIO(bio);
+ NodeBIO* nbio = FromBIO(bio);
if (nbio->Length() == 0)
return 0;
@@ -201,7 +196,7 @@ long NodeBIO::Ctrl(BIO* bio, int cmd, long num, // NOLINT(runtime/int)
ret = nbio->Length() == 0;
break;
case BIO_C_SET_BUF_MEM_EOF_RETURN:
- bio->num = num;
+ nbio->set_eof_return(num);
break;
case BIO_CTRL_INFO:
ret = nbio->Length();
@@ -216,10 +211,10 @@ long NodeBIO::Ctrl(BIO* bio, int cmd, long num, // NOLINT(runtime/int)
ret = 0;
break;
case BIO_CTRL_GET_CLOSE:
- ret = bio->shutdown;
+ ret = BIO_get_shutdown(bio);
break;
case BIO_CTRL_SET_CLOSE:
- bio->shutdown = num;
+ BIO_set_shutdown(bio, num);
break;
case BIO_CTRL_WPENDING:
ret = 0;
@@ -241,6 +236,41 @@ long NodeBIO::Ctrl(BIO* bio, int cmd, long num, // NOLINT(runtime/int)
}
+const BIO_METHOD* NodeBIO::GetMethod() {
+#if OPENSSL_VERSION_NUMBER < 0x10100000L
+ static const BIO_METHOD method = {
+ BIO_TYPE_MEM,
+ "node.js SSL buffer",
+ Write,
+ Read,
+ Puts,
+ Gets,
+ Ctrl,
+ New,
+ Free,
+ nullptr
+ };
+
+ return &method;
+#else
+ static BIO_METHOD* method = nullptr;
+
+ if (method == nullptr) {
+ method = BIO_meth_new(BIO_TYPE_MEM, "node.js SSL buffer");
+ BIO_meth_set_write(method, Write);
+ BIO_meth_set_read(method, Read);
+ BIO_meth_set_puts(method, Puts);
+ BIO_meth_set_gets(method, Gets);
+ BIO_meth_set_ctrl(method, Ctrl);
+ BIO_meth_set_create(method, New);
+ BIO_meth_set_destroy(method, Free);
+ }
+
+ return method;
+#endif
+}
+
+
void NodeBIO::TryMoveReadHead() {
// `read_pos_` and `write_pos_` means the position of the reader and writer
// inside the buffer, respectively. When they're equal - its safe to reset
@@ -488,5 +518,12 @@ NodeBIO::~NodeBIO() {
write_head_ = nullptr;
}
+
+NodeBIO* NodeBIO::FromBIO(BIO* bio) {
+ CHECK_NE(BIO_get_data(bio), nullptr);
+ return static_cast<NodeBIO*>(BIO_get_data(bio));
+}
+
+
} // namespace crypto
} // namespace node