summaryrefslogtreecommitdiff
path: root/libs
diff options
context:
space:
mode:
author Frederick Mayle <fmayle@google.com> 2022-05-05 01:21:04 +0000
committer Frederick Mayle <fmayle@google.com> 2022-05-12 20:18:56 +0000
commit297c277438735ebe2d5c99962a71e7e43fb8bde2 (patch)
treeabfea27e2e043f4f04c6adb330eb463ab6acc8d6 /libs
parent09034dd4101c42947edce4f9dde362629db7a836 (diff)
Fix RpcSession::setupPreconnectedClient
If you requested N connections, you'd get N connection objects using the same socket. Also, some error cases would leak sockets. Test: CLANG_ANALYZER_CHECKS=1 m tidy-frameworks-native-libs-binder Change-Id: I46528f952fdfc88d4e49b93499dbfbb39117b069
Diffstat (limited to 'libs')
-rw-r--r--libs/binder/RpcSession.cpp12
1 files changed, 4 insertions, 8 deletions
diff --git a/libs/binder/RpcSession.cpp b/libs/binder/RpcSession.cpp
index d40778a3d8..16991db58d 100644
--- a/libs/binder/RpcSession.cpp
+++ b/libs/binder/RpcSession.cpp
@@ -152,13 +152,7 @@ status_t RpcSession::setupInetClient(const char* addr, unsigned int port) {
}
status_t RpcSession::setupPreconnectedClient(unique_fd fd, std::function<unique_fd()>&& request) {
- // Why passing raw fd? When fd is passed as reference, Clang analyzer sees that the variable
- // `fd` is a moved-from object. To work-around the issue, unwrap the raw fd from the outer `fd`,
- // pass the raw fd by value to the lambda, and then finally wrap it in unique_fd inside the
- // lambda.
- return setupClient([&, raw = fd.release()](const std::vector<uint8_t>& sessionId,
- bool incoming) -> status_t {
- unique_fd fd(raw);
+ return setupClient([&](const std::vector<uint8_t>& sessionId, bool incoming) -> status_t {
if (!fd.ok()) {
fd = request();
if (!fd.ok()) return BAD_VALUE;
@@ -167,7 +161,9 @@ status_t RpcSession::setupPreconnectedClient(unique_fd fd, std::function<unique_
ALOGE("setupPreconnectedClient: %s", res.error().message().c_str());
return res.error().code() == 0 ? UNKNOWN_ERROR : -res.error().code();
}
- return initAndAddConnection(std::move(fd), sessionId, incoming);
+ status_t status = initAndAddConnection(std::move(fd), sessionId, incoming);
+ fd = unique_fd(); // Explicitly reset after move to avoid analyzer warning.
+ return status;
});
}