diff options
| -rw-r--r-- | cmds/idlcli/Android.bp | 2 | ||||
| -rw-r--r-- | libs/binder/Android.bp | 11 | ||||
| -rw-r--r-- | libs/binder/Parcel.cpp | 4 | ||||
| -rw-r--r-- | libs/binder/RpcSession.cpp | 56 | ||||
| -rw-r--r-- | libs/binder/RpcTransportRaw.cpp | 3 | ||||
| -rw-r--r-- | libs/binder/RpcTransportTls.cpp | 140 | ||||
| -rw-r--r-- | libs/binder/include/binder/RpcTransport.h | 29 | ||||
| -rw-r--r-- | libs/binder/ndk/tests/Android.bp | 6 | ||||
| -rw-r--r-- | libs/binder/rust/src/proxy.rs | 39 | ||||
| -rw-r--r-- | libs/binder/rust/tests/Android.bp | 2 | ||||
| -rw-r--r-- | libs/binder/tests/Android.bp | 6 | ||||
| -rw-r--r-- | libs/binder/tests/binderRpcTest.cpp | 7 | ||||
| -rw-r--r-- | libs/gralloc/types/Android.bp | 4 | ||||
| -rw-r--r-- | libs/ui/Android.bp | 4 | ||||
| -rw-r--r-- | services/memtrackproxy/Android.bp | 4 | ||||
| -rw-r--r-- | services/memtrackproxy/test/Android.bp | 2 | ||||
| -rw-r--r-- | services/surfaceflinger/tests/Android.bp | 2 |
17 files changed, 190 insertions, 131 deletions
diff --git a/cmds/idlcli/Android.bp b/cmds/idlcli/Android.bp index 99e0f4ceba..b2da6d57c1 100644 --- a/cmds/idlcli/Android.bp +++ b/cmds/idlcli/Android.bp @@ -24,7 +24,7 @@ package { cc_defaults { name: "idlcli-defaults", shared_libs: [ - "android.hardware.vibrator-V1-ndk_platform", + "android.hardware.vibrator-V1-ndk", "android.hardware.vibrator@1.0", "android.hardware.vibrator@1.1", "android.hardware.vibrator@1.2", diff --git a/libs/binder/Android.bp b/libs/binder/Android.bp index 72d8afdd7f..f53a2567c6 100644 --- a/libs/binder/Android.bp +++ b/libs/binder/Android.bp @@ -271,6 +271,15 @@ cc_library_shared { defaults: ["libbinder_tls_defaults"], } +// For testing +cc_library_static { + name: "libbinder_tls_static", + defaults: ["libbinder_tls_defaults"], + visibility: [ + ":__subpackages__", + ], +} + // AIDL interface between libbinder and framework.jar filegroup { name: "libbinder_aidl", @@ -329,6 +338,8 @@ cc_library { "//packages/modules/Virtualization/authfs:__subpackages__", "//packages/modules/Virtualization/compos:__subpackages__", "//packages/modules/Virtualization/microdroid", + "//packages/modules/Virtualization/microdroid_manager", + "//packages/modules/Virtualization/virtualizationservice", ], } diff --git a/libs/binder/Parcel.cpp b/libs/binder/Parcel.cpp index 956524ac74..b5454849eb 100644 --- a/libs/binder/Parcel.cpp +++ b/libs/binder/Parcel.cpp @@ -104,7 +104,7 @@ static void acquire_object(const sp<ProcessState>& proc, switch (obj.hdr.type) { case BINDER_TYPE_BINDER: if (obj.binder) { - LOG_REFS("Parcel %p acquiring reference on local %p", who, obj.cookie); + LOG_REFS("Parcel %p acquiring reference on local %llu", who, obj.cookie); reinterpret_cast<IBinder*>(obj.cookie)->incStrong(who); } return; @@ -137,7 +137,7 @@ static void release_object(const sp<ProcessState>& proc, switch (obj.hdr.type) { case BINDER_TYPE_BINDER: if (obj.binder) { - LOG_REFS("Parcel %p releasing reference on local %p", who, obj.cookie); + LOG_REFS("Parcel %p releasing reference on local %llu", who, obj.cookie); reinterpret_cast<IBinder*>(obj.cookie)->decStrong(who); } return; diff --git a/libs/binder/RpcSession.cpp b/libs/binder/RpcSession.cpp index 4c47005c7a..3e9e5a8441 100644 --- a/libs/binder/RpcSession.cpp +++ b/libs/binder/RpcSession.cpp @@ -484,37 +484,39 @@ status_t RpcSession::setupOneSocketConnection(const RpcSocketAddress& addr, } if (0 != TEMP_FAILURE_RETRY(connect(serverFd.get(), addr.addr(), addr.addrSize()))) { - if (errno == ECONNRESET) { + int connErrno = errno; + if (connErrno == EAGAIN || connErrno == EINPROGRESS) { + // For non-blocking sockets, connect() may return EAGAIN (for unix domain socket) or + // EINPROGRESS (for others). Call poll() and getsockopt() to get the error. + status_t pollStatus = mShutdownTrigger->triggerablePoll(serverFd, POLLOUT); + if (pollStatus != OK) { + ALOGE("Could not POLLOUT after connect() on non-blocking socket: %s", + statusToString(pollStatus).c_str()); + return pollStatus; + } + // Set connErrno to the errno that connect() would have set if the fd were blocking. + socklen_t connErrnoLen = sizeof(connErrno); + int ret = + getsockopt(serverFd.get(), SOL_SOCKET, SO_ERROR, &connErrno, &connErrnoLen); + if (ret == -1) { + int savedErrno = errno; + ALOGE("Could not getsockopt() after connect() on non-blocking socket: %s. " + "(Original error from connect() is: %s)", + strerror(savedErrno), strerror(connErrno)); + return -savedErrno; + } + // Retrieved the real connErrno as if connect() was called with a blocking socket + // fd. Continue checking connErrno. + } + if (connErrno == ECONNRESET) { ALOGW("Connection reset on %s", addr.toString().c_str()); continue; } - if (errno != EAGAIN && errno != EINPROGRESS) { - int savedErrno = errno; + // connErrno could be zero if getsockopt determines so. Hence zero-check again. + if (connErrno != 0) { ALOGE("Could not connect socket at %s: %s", addr.toString().c_str(), - strerror(savedErrno)); - return -savedErrno; - } - // For non-blocking sockets, connect() may return EAGAIN (for unix domain socket) or - // EINPROGRESS (for others). Call poll() and getsockopt() to get the error. - status_t pollStatus = mShutdownTrigger->triggerablePoll(serverFd, POLLOUT); - if (pollStatus != OK) { - ALOGE("Could not POLLOUT after connect() on non-blocking socket: %s", - statusToString(pollStatus).c_str()); - return pollStatus; - } - int soError; - socklen_t soErrorLen = sizeof(soError); - int ret = getsockopt(serverFd.get(), SOL_SOCKET, SO_ERROR, &soError, &soErrorLen); - if (ret == -1) { - int savedErrno = errno; - ALOGE("Could not getsockopt() after connect() on non-blocking socket: %s", - strerror(savedErrno)); - return -savedErrno; - } - if (soError != 0) { - ALOGE("After connect(), getsockopt() returns error for socket at %s: %s", - addr.toString().c_str(), strerror(soError)); - return -soError; + strerror(connErrno)); + return -connErrno; } } LOG_RPC_DETAIL("Socket at %s client with fd %d", addr.toString().c_str(), serverFd.get()); diff --git a/libs/binder/RpcTransportRaw.cpp b/libs/binder/RpcTransportRaw.cpp index d77fc52c61..930df12c2e 100644 --- a/libs/binder/RpcTransportRaw.cpp +++ b/libs/binder/RpcTransportRaw.cpp @@ -111,7 +111,10 @@ public: std::unique_ptr<RpcTransport> newTransport(android::base::unique_fd fd, FdTrigger*) const { return std::make_unique<RpcTransportRaw>(std::move(fd)); } + std::string getCertificate(CertificateFormat) const override { return {}; } + status_t addTrustedPeerCertificate(CertificateFormat, std::string_view) override { return OK; } }; + } // namespace std::unique_ptr<RpcTransportCtx> RpcTransportCtxFactoryRaw::newServerCtx() const { diff --git a/libs/binder/RpcTransportTls.cpp b/libs/binder/RpcTransportTls.cpp index a1029139ab..e6cb04e0a4 100644 --- a/libs/binder/RpcTransportTls.cpp +++ b/libs/binder/RpcTransportTls.cpp @@ -166,6 +166,34 @@ bssl::UniquePtr<X509> makeSelfSignedCert(EVP_PKEY* evp_pkey, const int valid_day } } +// Helper class to ErrorQueue::toString +class ErrorQueueString { +public: + static std::string toString() { + ErrorQueueString thiz; + ERR_print_errors_cb(staticCallback, &thiz); + return thiz.mSs.str(); + } + +private: + static int staticCallback(const char* str, size_t len, void* ctx) { + return reinterpret_cast<ErrorQueueString*>(ctx)->callback(str, len); + } + int callback(const char* str, size_t len) { + if (len == 0) return 1; // continue + // ERR_print_errors_cb place a new line at the end, but it doesn't say so in the API. + if (str[len - 1] == '\n') len -= 1; + if (!mIsFirst) { + mSs << '\n'; + } + mSs << std::string_view(str, len); + mIsFirst = false; + return 1; // continue + } + std::stringstream mSs; + bool mIsFirst = true; +}; + // Handles libssl's error queue. // // Call into any of its member functions to ensure the error queue is properly handled or cleared. @@ -182,17 +210,10 @@ public: // Stores the error queue in |ssl| into a string, then clears the error queue. std::string toString() { - std::stringstream ss; - ERR_print_errors_cb( - [](const char* str, size_t len, void* ctx) { - auto ss = (std::stringstream*)ctx; - (*ss) << std::string_view(str, len) << "\n"; - return 1; // continue - }, - &ss); + auto ret = ErrorQueueString::toString(); // Though ERR_print_errors_cb should have cleared it, it is okay to clear again. clear(); - return ss.str(); + return ret; } // |sslError| should be from Ssl::getError(). @@ -428,65 +449,46 @@ bool setFdAndDoHandshake(Ssl* ssl, android::base::borrowed_fd fd, FdTrigger* fdT } } -class RpcTransportCtxTlsServer : public RpcTransportCtx { +class RpcTransportCtxTls : public RpcTransportCtx { public: - static std::unique_ptr<RpcTransportCtxTlsServer> create(); - std::unique_ptr<RpcTransport> newTransport(android::base::unique_fd acceptedFd, + template <typename Impl, + typename = std::enable_if_t<std::is_base_of_v<RpcTransportCtxTls, Impl>>> + static std::unique_ptr<RpcTransportCtxTls> create(); + std::unique_ptr<RpcTransport> newTransport(android::base::unique_fd fd, FdTrigger* fdTrigger) const override; + std::string getCertificate(CertificateFormat) const override; + status_t addTrustedPeerCertificate(CertificateFormat, std::string_view cert) override; -private: +protected: + virtual void preHandshake(Ssl* ssl) const = 0; bssl::UniquePtr<SSL_CTX> mCtx; }; -std::unique_ptr<RpcTransportCtxTlsServer> RpcTransportCtxTlsServer::create() { +std::string RpcTransportCtxTls::getCertificate(CertificateFormat) const { + // TODO(b/195166979): return certificate here + return {}; +} + +status_t RpcTransportCtxTls::addTrustedPeerCertificate(CertificateFormat, std::string_view) { + // TODO(b/195166979): set certificate here + return OK; +} + +// Common implementation for creating server and client contexts. The child class, |Impl|, is +// provided as a template argument so that this function can initialize an |Impl| object. +template <typename Impl, typename> +std::unique_ptr<RpcTransportCtxTls> RpcTransportCtxTls::create() { bssl::UniquePtr<SSL_CTX> ctx(SSL_CTX_new(TLS_method())); TEST_AND_RETURN(nullptr, ctx != nullptr); - // Server use self-signing cert auto evp_pkey = makeKeyPairForSelfSignedCert(); TEST_AND_RETURN(nullptr, evp_pkey != nullptr); auto cert = makeSelfSignedCert(evp_pkey.get(), kCertValidDays); TEST_AND_RETURN(nullptr, cert != nullptr); TEST_AND_RETURN(nullptr, SSL_CTX_use_PrivateKey(ctx.get(), evp_pkey.get())); TEST_AND_RETURN(nullptr, SSL_CTX_use_certificate(ctx.get(), cert.get())); - // Require at least TLS 1.3 - TEST_AND_RETURN(nullptr, SSL_CTX_set_min_proto_version(ctx.get(), TLS1_3_VERSION)); - - if constexpr (SHOULD_LOG_TLS_DETAIL) { // NOLINT - SSL_CTX_set_info_callback(ctx.get(), sslDebugLog); - } - - auto rpcTransportTlsServerCtx = std::make_unique<RpcTransportCtxTlsServer>(); - rpcTransportTlsServerCtx->mCtx = std::move(ctx); - return rpcTransportTlsServerCtx; -} -std::unique_ptr<RpcTransport> RpcTransportCtxTlsServer::newTransport( - android::base::unique_fd acceptedFd, FdTrigger* fdTrigger) const { - bssl::UniquePtr<SSL> ssl(SSL_new(mCtx.get())); - TEST_AND_RETURN(nullptr, ssl != nullptr); - Ssl wrapped(std::move(ssl)); - - wrapped.call(SSL_set_accept_state).errorQueue.clear(); - TEST_AND_RETURN(nullptr, setFdAndDoHandshake(&wrapped, acceptedFd, fdTrigger)); - return std::make_unique<RpcTransportTls>(std::move(acceptedFd), std::move(wrapped)); -} - -class RpcTransportCtxTlsClient : public RpcTransportCtx { -public: - static std::unique_ptr<RpcTransportCtxTlsClient> create(); - std::unique_ptr<RpcTransport> newTransport(android::base::unique_fd connectedFd, - FdTrigger* fdTrigger) const override; - -private: - bssl::UniquePtr<SSL_CTX> mCtx; -}; - -std::unique_ptr<RpcTransportCtxTlsClient> RpcTransportCtxTlsClient::create() { - bssl::UniquePtr<SSL_CTX> ctx(SSL_CTX_new(TLS_method())); - TEST_AND_RETURN(nullptr, ctx != nullptr); - - // TODO(b/195166979): server should send certificate in a different channel, and client + // TODO(b/195166979): peer should send certificate in a different channel, and this class // should verify it here. SSL_CTX_set_custom_verify(ctx.get(), SSL_VERIFY_PEER, [](SSL*, uint8_t*) -> ssl_verify_result_t { return ssl_verify_ok; }); @@ -498,30 +500,44 @@ std::unique_ptr<RpcTransportCtxTlsClient> RpcTransportCtxTlsClient::create() { SSL_CTX_set_info_callback(ctx.get(), sslDebugLog); } - auto rpcTransportTlsClientCtx = std::make_unique<RpcTransportCtxTlsClient>(); - rpcTransportTlsClientCtx->mCtx = std::move(ctx); - return rpcTransportTlsClientCtx; + auto ret = std::make_unique<Impl>(); + ret->mCtx = std::move(ctx); + return ret; } -std::unique_ptr<RpcTransport> RpcTransportCtxTlsClient::newTransport( - android::base::unique_fd connectedFd, FdTrigger* fdTrigger) const { +std::unique_ptr<RpcTransport> RpcTransportCtxTls::newTransport(android::base::unique_fd fd, + FdTrigger* fdTrigger) const { bssl::UniquePtr<SSL> ssl(SSL_new(mCtx.get())); TEST_AND_RETURN(nullptr, ssl != nullptr); Ssl wrapped(std::move(ssl)); - wrapped.call(SSL_set_connect_state).errorQueue.clear(); - TEST_AND_RETURN(nullptr, setFdAndDoHandshake(&wrapped, connectedFd, fdTrigger)); - return std::make_unique<RpcTransportTls>(std::move(connectedFd), std::move(wrapped)); + preHandshake(&wrapped); + TEST_AND_RETURN(nullptr, setFdAndDoHandshake(&wrapped, fd, fdTrigger)); + return std::make_unique<RpcTransportTls>(std::move(fd), std::move(wrapped)); } +class RpcTransportCtxTlsServer : public RpcTransportCtxTls { +protected: + void preHandshake(Ssl* ssl) const override { + ssl->call(SSL_set_accept_state).errorQueue.clear(); + } +}; + +class RpcTransportCtxTlsClient : public RpcTransportCtxTls { +protected: + void preHandshake(Ssl* ssl) const override { + ssl->call(SSL_set_connect_state).errorQueue.clear(); + } +}; + } // namespace std::unique_ptr<RpcTransportCtx> RpcTransportCtxFactoryTls::newServerCtx() const { - return android::RpcTransportCtxTlsServer::create(); + return android::RpcTransportCtxTls::create<RpcTransportCtxTlsServer>(); } std::unique_ptr<RpcTransportCtx> RpcTransportCtxFactoryTls::newClientCtx() const { - return android::RpcTransportCtxTlsClient::create(); + return android::RpcTransportCtxTls::create<RpcTransportCtxTlsClient>(); } const char* RpcTransportCtxFactoryTls::toCString() const { diff --git a/libs/binder/include/binder/RpcTransport.h b/libs/binder/include/binder/RpcTransport.h index 1b6951986e..8d08b34ef4 100644 --- a/libs/binder/include/binder/RpcTransport.h +++ b/libs/binder/include/binder/RpcTransport.h @@ -29,7 +29,13 @@ namespace android { class FdTrigger; +enum class CertificateFormat { + PEM, + // TODO(b/195166979): support other formats, e.g. DER +}; + // Represents a socket connection. +// No thread-safety is guaranteed for these APIs. class RpcTransport { public: virtual ~RpcTransport() = default; @@ -53,22 +59,43 @@ protected: }; // Represents the context that generates the socket connection. +// All APIs are thread-safe. See RpcTransportCtxRaw and RpcTransportCtxTls for details. class RpcTransportCtx { public: virtual ~RpcTransportCtx() = default; // Create a new RpcTransport object. // - // Implemenion details: for TLS, this function may incur I/O. |fdTrigger| may be used + // Implementation details: for TLS, this function may incur I/O. |fdTrigger| may be used // to interrupt I/O. This function blocks until handshake is finished. [[nodiscard]] virtual std::unique_ptr<RpcTransport> newTransport( android::base::unique_fd fd, FdTrigger *fdTrigger) const = 0; + // Return the preconfigured certificate of this context. + // + // Implementation details: + // - For raw sockets, this always returns empty string. + // - For TLS, this returns the certificate. See RpcTransportTls for details. + [[nodiscard]] virtual std::string getCertificate(CertificateFormat format) const = 0; + + // Add a trusted peer certificate. Peers presenting this certificate are accepted. + // + // Caller must ensure that newTransport() are called after all trusted peer certificates + // are added. Otherwise, RpcTransport-s created before may not trust peer certificates + // added later. + // + // Implementation details: + // - For raw sockets, this always returns OK. + // - For TLS, this adds trusted peer certificate. See RpcTransportTls for details. + [[nodiscard]] virtual status_t addTrustedPeerCertificate(CertificateFormat format, + std::string_view cert) = 0; + protected: RpcTransportCtx() = default; }; // A factory class that generates RpcTransportCtx. +// All APIs are thread-safe. class RpcTransportCtxFactory { public: virtual ~RpcTransportCtxFactory() = default; diff --git a/libs/binder/ndk/tests/Android.bp b/libs/binder/ndk/tests/Android.bp index 488009f812..8ee396e256 100644 --- a/libs/binder/ndk/tests/Android.bp +++ b/libs/binder/ndk/tests/Android.bp @@ -71,7 +71,7 @@ cc_test { srcs: ["libbinder_ndk_unit_test.cpp"], static_libs: [ "IBinderNdkUnitTest-cpp", - "IBinderNdkUnitTest-ndk_platform", + "IBinderNdkUnitTest-ndk", ], test_suites: [ "general-tests", @@ -88,8 +88,8 @@ cc_test { ], static_libs: [ "IBinderVendorDoubleLoadTest-cpp", - "IBinderVendorDoubleLoadTest-ndk_platform", - "libbinder_aidl_test_stub-ndk_platform", + "IBinderVendorDoubleLoadTest-ndk", + "libbinder_aidl_test_stub-ndk", ], // critical that libbinder/libbinder_ndk are shared for VTS shared_libs: [ diff --git a/libs/binder/rust/src/proxy.rs b/libs/binder/rust/src/proxy.rs index cdd7c081d0..b03ed49e51 100644 --- a/libs/binder/rust/src/proxy.rs +++ b/libs/binder/rust/src/proxy.rs @@ -38,7 +38,7 @@ use std::ptr; /// /// This struct encapsulates the generic C++ `sp<IBinder>` class. This wrapper /// is untyped; typed interface access is implemented by the AIDL compiler. -pub struct SpIBinder(*mut sys::AIBinder); +pub struct SpIBinder(ptr::NonNull<sys::AIBinder>); impl fmt::Debug for SpIBinder { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { @@ -74,7 +74,7 @@ impl SpIBinder { /// to an `AIBinder`, which will remain valid for the entire lifetime of the /// `SpIBinder` (we keep a strong reference, and only decrement on drop). pub(crate) unsafe fn from_raw(ptr: *mut sys::AIBinder) -> Option<Self> { - ptr.as_mut().map(|p| Self(p)) + ptr::NonNull::new(ptr).map(Self) } /// Extract a raw `AIBinder` pointer from this wrapper. @@ -88,7 +88,7 @@ impl SpIBinder { /// The SpIBinder object retains ownership of the AIBinder and the caller /// should not attempt to free the returned pointer. pub unsafe fn as_raw(&self) -> *mut sys::AIBinder { - self.0 + self.0.as_ptr() } /// Return true if this binder object is hosted in a different process than @@ -176,13 +176,13 @@ impl Ord for SpIBinder { // Safety: SpIBinder always holds a valid `AIBinder` pointer, so // this pointer is always safe to pass to `AIBinder_lt` (null is // also safe to pass to this function, but we should never do that). - sys::AIBinder_lt(self.0, other.0) + sys::AIBinder_lt(self.0.as_ptr(), other.0.as_ptr()) }; let greater_than = unsafe { // Safety: SpIBinder always holds a valid `AIBinder` pointer, so // this pointer is always safe to pass to `AIBinder_lt` (null is // also safe to pass to this function, but we should never do that). - sys::AIBinder_lt(other.0, self.0) + sys::AIBinder_lt(other.0.as_ptr(), self.0.as_ptr()) }; if !less_than && !greater_than { Ordering::Equal @@ -202,7 +202,7 @@ impl PartialOrd for SpIBinder { impl PartialEq for SpIBinder { fn eq(&self, other: &Self) -> bool { - ptr::eq(self.0, other.0) + ptr::eq(self.0.as_ptr(), other.0.as_ptr()) } } @@ -214,7 +214,7 @@ impl Clone for SpIBinder { // Safety: Cloning a strong reference must increment the reference // count. We are guaranteed by the `SpIBinder` constructor // invariants that `self.0` is always a valid `AIBinder` pointer. - sys::AIBinder_incStrong(self.0); + sys::AIBinder_incStrong(self.0.as_ptr()); } Self(self.0) } @@ -443,7 +443,7 @@ impl DeserializeArray for Option<SpIBinder> {} /// /// This struct encapsulates the generic C++ `wp<IBinder>` class. This wrapper /// is untyped; typed interface access is implemented by the AIDL compiler. -pub struct WpIBinder(*mut sys::AIBinder_Weak); +pub struct WpIBinder(ptr::NonNull<sys::AIBinder_Weak>); impl fmt::Debug for WpIBinder { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { @@ -470,8 +470,7 @@ impl WpIBinder { // valid pointer to an `AIBinder`. sys::AIBinder_Weak_new(binder.as_native_mut()) }; - assert!(!ptr.is_null()); - Self(ptr) + Self(ptr::NonNull::new(ptr).expect("Unexpected null pointer from AIBinder_Weak_new")) } /// Promote this weak reference to a strong reference to the binder object. @@ -481,7 +480,7 @@ impl WpIBinder { // can pass this pointer to `AIBinder_Weak_promote`. Returns either // null or an AIBinder owned by the caller, both of which are valid // to pass to `SpIBinder::from_raw`. - let ptr = sys::AIBinder_Weak_promote(self.0); + let ptr = sys::AIBinder_Weak_promote(self.0.as_ptr()); SpIBinder::from_raw(ptr) } } @@ -496,13 +495,9 @@ impl Clone for WpIBinder { // // We get ownership of the returned pointer, so can construct a new // WpIBinder object from it. - sys::AIBinder_Weak_clone(self.0) + sys::AIBinder_Weak_clone(self.0.as_ptr()) }; - assert!( - !ptr.is_null(), - "Unexpected null pointer from AIBinder_Weak_clone" - ); - Self(ptr) + Self(ptr::NonNull::new(ptr).expect("Unexpected null pointer from AIBinder_Weak_clone")) } } @@ -513,14 +508,14 @@ impl Ord for WpIBinder { // so this pointer is always safe to pass to `AIBinder_Weak_lt` // (null is also safe to pass to this function, but we should never // do that). - sys::AIBinder_Weak_lt(self.0, other.0) + sys::AIBinder_Weak_lt(self.0.as_ptr(), other.0.as_ptr()) }; let greater_than = unsafe { // Safety: WpIBinder always holds a valid `AIBinder_Weak` pointer, // so this pointer is always safe to pass to `AIBinder_Weak_lt` // (null is also safe to pass to this function, but we should never // do that). - sys::AIBinder_Weak_lt(other.0, self.0) + sys::AIBinder_Weak_lt(other.0.as_ptr(), self.0.as_ptr()) }; if !less_than && !greater_than { Ordering::Equal @@ -551,7 +546,7 @@ impl Drop for WpIBinder { unsafe { // Safety: WpIBinder always holds a valid `AIBinder_Weak` pointer, so we // know this pointer is safe to pass to `AIBinder_Weak_delete` here. - sys::AIBinder_Weak_delete(self.0); + sys::AIBinder_Weak_delete(self.0.as_ptr()); } } } @@ -716,10 +711,10 @@ pub fn wait_for_interface<T: FromIBinder + ?Sized>(name: &str) -> Result<Strong< /// `AIBinder`, so we can trivially extract this pointer here. unsafe impl AsNative<sys::AIBinder> for SpIBinder { fn as_native(&self) -> *const sys::AIBinder { - self.0 + self.0.as_ptr() } fn as_native_mut(&mut self) -> *mut sys::AIBinder { - self.0 + self.0.as_ptr() } } diff --git a/libs/binder/rust/tests/Android.bp b/libs/binder/rust/tests/Android.bp index 607860f462..ecc61f4683 100644 --- a/libs/binder/rust/tests/Android.bp +++ b/libs/binder/rust/tests/Android.bp @@ -50,7 +50,7 @@ cc_test { "libbinder_ndk", ], static_libs: [ - "IBinderRustNdkInteropTest-ndk_platform", + "IBinderRustNdkInteropTest-ndk", "libbinder_ndk_rust_interop", ], test_suites: ["general-tests"], diff --git a/libs/binder/tests/Android.bp b/libs/binder/tests/Android.bp index b29da3cbb6..13ea8272e2 100644 --- a/libs/binder/tests/Android.bp +++ b/libs/binder/tests/Android.bp @@ -145,6 +145,7 @@ cc_test { defaults: [ "binder_test_defaults", "libbinder_ndk_host_user", + "libbinder_tls_shared_deps", ], srcs: [ @@ -159,8 +160,9 @@ cc_test { "liblog", ], static_libs: [ + "libbinder_tls_static", "binderRpcTestIface-cpp", - "binderRpcTestIface-ndk_platform", + "binderRpcTestIface-ndk", ], test_suites: ["general-tests"], require_root: true, @@ -323,7 +325,7 @@ cc_test { ], static_libs: [ "binderStabilityTestIface-cpp", - "binderStabilityTestIface-ndk_platform", + "binderStabilityTestIface-ndk", ], test_suites: ["device-tests", "vts"], diff --git a/libs/binder/tests/binderRpcTest.cpp b/libs/binder/tests/binderRpcTest.cpp index 15ccae9399..35db4444d5 100644 --- a/libs/binder/tests/binderRpcTest.cpp +++ b/libs/binder/tests/binderRpcTest.cpp @@ -31,6 +31,7 @@ #include <binder/RpcSession.h> #include <binder/RpcTransport.h> #include <binder/RpcTransportRaw.h> +#include <binder/RpcTransportTls.h> #include <gtest/gtest.h> #include <chrono> @@ -54,16 +55,18 @@ static_assert(RPC_WIRE_PROTOCOL_VERSION + 1 == RPC_WIRE_PROTOCOL_VERSION_NEXT || RPC_WIRE_PROTOCOL_VERSION == RPC_WIRE_PROTOCOL_VERSION_EXPERIMENTAL); const char* kLocalInetAddress = "127.0.0.1"; -enum class RpcSecurity { RAW }; +enum class RpcSecurity { RAW, TLS }; static inline std::vector<RpcSecurity> RpcSecurityValues() { - return {RpcSecurity::RAW}; + return {RpcSecurity::RAW, RpcSecurity::TLS}; } static inline std::unique_ptr<RpcTransportCtxFactory> newFactory(RpcSecurity rpcSecurity) { switch (rpcSecurity) { case RpcSecurity::RAW: return RpcTransportCtxFactoryRaw::make(); + case RpcSecurity::TLS: + return RpcTransportCtxFactoryTls::make(); default: LOG_ALWAYS_FATAL("Unknown RpcSecurity %d", rpcSecurity); } diff --git a/libs/gralloc/types/Android.bp b/libs/gralloc/types/Android.bp index a0032aecb9..cda9e19c1e 100644 --- a/libs/gralloc/types/Android.bp +++ b/libs/gralloc/types/Android.bp @@ -52,14 +52,14 @@ cc_library { ], shared_libs: [ - "android.hardware.graphics.common-V2-ndk_platform", + "android.hardware.graphics.common-V2-ndk", "android.hardware.graphics.mapper@4.0", "libhidlbase", "liblog", ], export_shared_lib_headers: [ - "android.hardware.graphics.common-V2-ndk_platform", + "android.hardware.graphics.common-V2-ndk", "android.hardware.graphics.mapper@4.0", "libhidlbase", ], diff --git a/libs/ui/Android.bp b/libs/ui/Android.bp index 07760ab765..26c874ec27 100644 --- a/libs/ui/Android.bp +++ b/libs/ui/Android.bp @@ -89,7 +89,7 @@ cc_library_shared { "android.hardware.graphics.allocator@2.0", "android.hardware.graphics.allocator@3.0", "android.hardware.graphics.allocator@4.0", - "android.hardware.graphics.common-V2-ndk_platform", + "android.hardware.graphics.common-V2-ndk", "android.hardware.graphics.common@1.2", "android.hardware.graphics.mapper@2.0", "android.hardware.graphics.mapper@2.1", @@ -106,7 +106,7 @@ cc_library_shared { export_shared_lib_headers: [ "android.hardware.graphics.common@1.2", - "android.hardware.graphics.common-V2-ndk_platform", + "android.hardware.graphics.common-V2-ndk", "android.hardware.graphics.mapper@4.0", "libgralloctypes", ], diff --git a/services/memtrackproxy/Android.bp b/services/memtrackproxy/Android.bp index 7d78f3b2cf..3233cc9348 100644 --- a/services/memtrackproxy/Android.bp +++ b/services/memtrackproxy/Android.bp @@ -32,7 +32,7 @@ cc_library_shared { "libcutils", "libutils", "android.hardware.memtrack@1.0", - "android.hardware.memtrack-V1-ndk_platform", + "android.hardware.memtrack-V1-ndk", ], srcs: [ "MemtrackProxy.cpp", @@ -45,6 +45,6 @@ cc_library_shared { ], export_shared_lib_headers: [ "android.hardware.memtrack@1.0", - "android.hardware.memtrack-V1-ndk_platform", + "android.hardware.memtrack-V1-ndk", ], } diff --git a/services/memtrackproxy/test/Android.bp b/services/memtrackproxy/test/Android.bp index f943761ee8..1dc21bfaac 100644 --- a/services/memtrackproxy/test/Android.bp +++ b/services/memtrackproxy/test/Android.bp @@ -29,7 +29,7 @@ cc_test { shared_libs: [ "libbinder_ndk", "libmemtrackproxy", - "android.hardware.memtrack-V1-ndk_platform", + "android.hardware.memtrack-V1-ndk", ], test_suites: ["general-tests"], require_root: true, diff --git a/services/surfaceflinger/tests/Android.bp b/services/surfaceflinger/tests/Android.bp index 15744a1609..81e39c7f30 100644 --- a/services/surfaceflinger/tests/Android.bp +++ b/services/surfaceflinger/tests/Android.bp @@ -53,7 +53,7 @@ cc_test { "libtrace_proto", ], shared_libs: [ - "android.hardware.graphics.common-V2-ndk_platform", + "android.hardware.graphics.common-V2-ndk", "android.hardware.graphics.common@1.2", "android.hardware.graphics.composer@2.1", "libandroid", |