Also add BIO_meth_get_write and BIO_meth_get_read
The Folly library has also fallen to this folly and uses these functions
to even get at read/write hooks (although they then replace them). These
are the problem ones that will break if the library ever moves to
size_t-clean hooks, but so it goes.
When we go to size_t-clean these functions, we can just make int-based
ones just for these broken APIs to return.
Bug: 412269080
Change-Id: I9def3d67cb751b2a85c00527d63231983f0f02c4
Reviewed-on: https://boringssl-review.googlesource.com/c/boringssl/+/79047
Reviewed-by: Adam Langley <agl@google.com>
Auto-Submit: David Benjamin <davidben@google.com>
Commit-Queue: Adam Langley <agl@google.com>
diff --git a/crypto/bio/socket.cc b/crypto/bio/socket.cc
index 9888fa2..d80b796 100644
--- a/crypto/bio/socket.cc
+++ b/crypto/bio/socket.cc
@@ -132,13 +132,15 @@
return ret;
}
-// These functions are provided solely for compatibility with older versions of
-// PostgreSQL. See bio.h for details. PostgreSQL's use makes several fragile
-// assumptions on |BIO_s_socket|:
+// These functions are provided solely for compatibility with software that
+// tries to copy and then modify |BIO_s_socket|. See bio.h for details.
+// PostgreSQL's use makes several fragile assumptions on |BIO_s_socket|:
//
// - We do not store anything in |BIO_set_data|. (Broken in upstream OpenSSL,
// which broke PostgreSQL.)
// - We do not store anything in |BIO_set_app_data|.
+// - |BIO_s_socket| is implemented internally using the non-|size_t|-clean
+// I/O functions rather than the |size_t|-clean ones.
// - |BIO_METHOD| never gains another function pointer that is used in concert
// with any of the functions here.
//
@@ -148,17 +150,27 @@
// implemented in BoringSSL.)
//
// This is hopelessly fragile. PostgreSQL 18 will include a fix to stop using
-// these APIs, but older versions remain impact, so we implement these
-// functions, but only support |BIO_s_socket|. For now they just return the
-// underlying functions, but if we ever need to break the above assumptions, we
-// can return an older, frozen version of |BIO_s_socket|. Limiting to exactly
-// one allowed |BIO_METHOD| lets us do this.
+// these APIs, but older versions and other software remain impacted, so we
+// implement these functions, but only support |BIO_s_socket|. For now they just
+// return the underlying functions, but if we ever need to break the above
+// assumptions, we can return an older, frozen version of |BIO_s_socket|.
+// Limiting to exactly one allowed |BIO_METHOD| lets us do this.
//
// These functions are also deprecated in upstream OpenSSL. See
// https://github.com/openssl/openssl/issues/26047
//
-// TODO(davidben): Once all versions of PostgreSQL we care about are updated or
-// patched, remove these functions.
+// TODO(davidben): Once Folly and all versions of PostgreSQL we care about are
+// updated or patched, remove these functions.
+
+int (*BIO_meth_get_write(const BIO_METHOD *method))(BIO *, const char *, int) {
+ BSSL_CHECK(method == BIO_s_socket());
+ return method->bwrite;
+}
+
+int (*BIO_meth_get_read(const BIO_METHOD *method))(BIO *, char *, int) {
+ BSSL_CHECK(method == BIO_s_socket());
+ return method->bread;
+}
int (*BIO_meth_get_gets(const BIO_METHOD *method))(BIO *, char *, int) {
BSSL_CHECK(method == BIO_s_socket());
diff --git a/include/openssl/bio.h b/include/openssl/bio.h
index a3e7609..7a576b4 100644
--- a/include/openssl/bio.h
+++ b/include/openssl/bio.h
@@ -809,9 +809,9 @@
// Using these functions is inherently unsafe and fragile. It is not possible to
// use them in a future-proof way. See
// https://github.com/openssl/openssl/issues/26047 for details. BoringSSL
-// implements them solely for compatibility with older versions of PostgreSQL.
-// To work around the future-proofing problems, the return values may diverge
-// from the true implementation of |BIO_s_socket|.
+// implements them solely for compatibility with Folly and older versions of
+// PostgreSQL. To work around the future-proofing problems, the return values
+// may diverge from the true implementation of |BIO_s_socket|.
//
// Caller should not use these functions. They are not necessary to define
// custom |BIO_METHOD|s. Instead, callers should either:
@@ -825,6 +825,11 @@
// - Define a custom |BIO_METHOD| without |BIO_s_socket| at all. If not using
// the built-in read or write functions, |BIO_s_socket| only provides a no-op
// |BIO_CTRL_FLUSH| implementation. This can be implemented by the caller.
+OPENSSL_EXPORT int (*BIO_meth_get_write(const BIO_METHOD *method))(BIO *,
+ const char *,
+ int);
+OPENSSL_EXPORT int (*BIO_meth_get_read(const BIO_METHOD *method))(BIO *, char *,
+ int);
OPENSSL_EXPORT int (*BIO_meth_get_gets(const BIO_METHOD *method))(BIO *, char *,
int);
OPENSSL_EXPORT int (*BIO_meth_get_puts(const BIO_METHOD *method))(BIO *,