Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit f6d4229b authored by Yifan Hong's avatar Yifan Hong
Browse files

binder: RpcTranpsortCtx::newTransport Add FdTrigger arg.

For TLS, creating a new RpcTransport object may require I/O.
Make them interruptable by providing an FdTrigger argument.

Test: binderRpcTest
Bug: 190868302

Change-Id: I63a6655f50d1b2fa5a484860ec422021e88de3e5
parent d9f8cef5
Loading
Loading
Loading
Loading
+1 −1
Original line number Original line Diff line number Diff line
@@ -260,7 +260,7 @@ void RpcServer::establishConnection(sp<RpcServer>&& server, base::unique_fd clie
    status_t status = OK;
    status_t status = OK;


    int clientFdForLog = clientFd.get();
    int clientFdForLog = clientFd.get();
    auto client = server->mCtx->newTransport(std::move(clientFd));
    auto client = server->mCtx->newTransport(std::move(clientFd), server->mShutdownTrigger.get());
    if (client == nullptr) {
    if (client == nullptr) {
        ALOGE("Dropping accept4()-ed socket because sslAccept fails");
        ALOGE("Dropping accept4()-ed socket because sslAccept fails");
        status = DEAD_OBJECT;
        status = DEAD_OBJECT;
+2 −2
Original line number Original line Diff line number Diff line
@@ -160,7 +160,7 @@ status_t RpcSession::addNullDebuggingClient() {
        ALOGE("Unable to create RpcTransportCtx for null debugging client");
        ALOGE("Unable to create RpcTransportCtx for null debugging client");
        return NO_MEMORY;
        return NO_MEMORY;
    }
    }
    auto server = ctx->newTransport(std::move(serverFd));
    auto server = ctx->newTransport(std::move(serverFd), mShutdownTrigger.get());
    if (server == nullptr) {
    if (server == nullptr) {
        ALOGE("Unable to set up RpcTransport");
        ALOGE("Unable to set up RpcTransport");
        return UNKNOWN_ERROR;
        return UNKNOWN_ERROR;
@@ -536,7 +536,7 @@ status_t RpcSession::initAndAddConnection(unique_fd fd, const RpcAddress& sessio
              mRpcTransportCtxFactory->toCString());
              mRpcTransportCtxFactory->toCString());
        return NO_MEMORY;
        return NO_MEMORY;
    }
    }
    auto server = ctx->newTransport(std::move(fd));
    auto server = ctx->newTransport(std::move(fd), mShutdownTrigger.get());
    if (server == nullptr) {
    if (server == nullptr) {
        ALOGE("Unable to set up RpcTransport in %s context", mRpcTransportCtxFactory->toCString());
        ALOGE("Unable to set up RpcTransport in %s context", mRpcTransportCtxFactory->toCString());
        return UNKNOWN_ERROR;
        return UNKNOWN_ERROR;
+1 −1
Original line number Original line Diff line number Diff line
@@ -108,7 +108,7 @@ private:
// RpcTransportCtx with TLS disabled.
// RpcTransportCtx with TLS disabled.
class RpcTransportCtxRaw : public RpcTransportCtx {
class RpcTransportCtxRaw : public RpcTransportCtx {
public:
public:
    std::unique_ptr<RpcTransport> newTransport(android::base::unique_fd fd) const {
    std::unique_ptr<RpcTransport> newTransport(android::base::unique_fd fd, FdTrigger*) const {
        return std::make_unique<RpcTransportRaw>(std::move(fd));
        return std::make_unique<RpcTransportRaw>(std::move(fd));
    }
    }
};
};
+6 −1
Original line number Original line Diff line number Diff line
@@ -56,8 +56,13 @@ protected:
class RpcTransportCtx {
class RpcTransportCtx {
public:
public:
    virtual ~RpcTransportCtx() = default;
    virtual ~RpcTransportCtx() = default;

    // Create a new RpcTransport object.
    //
    // Implemenion 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(
    [[nodiscard]] virtual std::unique_ptr<RpcTransport> newTransport(
            android::base::unique_fd fd) const = 0;
            android::base::unique_fd fd, FdTrigger *fdTrigger) const = 0;


protected:
protected:
    RpcTransportCtx() = default;
    RpcTransportCtx() = default;