Loading libs/binder/RpcState.cpp +17 −12 Original line number Diff line number Diff line Loading @@ -563,7 +563,7 @@ status_t RpcState::transactAddress(const sp<RpcSession::RpcConnection>& connecti static void cleanup_reply_data(Parcel* p, const uint8_t* data, size_t dataSize, const binder_size_t* objects, size_t objectsCount) { (void)p; delete[] const_cast<uint8_t*>(data - offsetof(RpcWireReply, data)); delete[] const_cast<uint8_t*>(data); (void)dataSize; LOG_ALWAYS_FATAL_IF(objects != nullptr); LOG_ALWAYS_FATAL_IF(objectsCount != 0, "%zu objects remaining", objectsCount); Loading @@ -585,25 +585,30 @@ status_t RpcState::waitForReply(const sp<RpcSession::RpcConnection>& connection, return status; } CommandData data(command.bodySize); if (!data.valid()) return NO_MEMORY; iovec iov{data.data(), command.bodySize}; if (status_t status = rpcRec(connection, session, "reply body", &iov, 1); status != OK) return status; if (command.bodySize < sizeof(RpcWireReply)) { ALOGE("Expecting %zu but got %" PRId32 " bytes for RpcWireReply. Terminating!", sizeof(RpcWireReply), command.bodySize); (void)session->shutdownAndWait(false); return BAD_VALUE; } RpcWireReply* rpcReply = reinterpret_cast<RpcWireReply*>(data.data()); if (rpcReply->status != OK) return rpcReply->status; RpcWireReply rpcReply; CommandData data(command.bodySize - sizeof(RpcWireReply)); if (!data.valid()) return NO_MEMORY; iovec iovs[]{ {&rpcReply, sizeof(RpcWireReply)}, {data.data(), data.size()}, }; if (status_t status = rpcRec(connection, session, "reply body", iovs, arraysize(iovs)); status != OK) return status; if (rpcReply.status != OK) return rpcReply.status; uint8_t* parcelData = data.data(); size_t parcelDataSize = data.size(); data.release(); reply->rpcSetDataReference(session, rpcReply->data, command.bodySize - offsetof(RpcWireReply, data), cleanup_reply_data); reply->rpcSetDataReference(session, parcelData, parcelDataSize, cleanup_reply_data); return OK; } Loading libs/binder/RpcWireFormat.h +0 −1 Original line number Diff line number Diff line Loading @@ -139,7 +139,6 @@ static_assert(sizeof(RpcWireTransaction) == 40); struct RpcWireReply { int32_t status; // transact return uint8_t data[]; }; static_assert(sizeof(RpcWireReply) == 4); Loading libs/binder/tests/binderAllocationLimits.cpp +9 −7 Original line number Diff line number Diff line Loading @@ -203,13 +203,15 @@ TEST(RpcBinderAllocation, SetupRpcServer) { auto remoteBinder = session->getRootObject(); size_t mallocs = 0, totalBytes = 0; { const auto on_malloc = OnMalloc([&](size_t bytes) { mallocs++; totalBytes += bytes; }); CHECK_EQ(OK, remoteBinder->pingBinder()); EXPECT_EQ(mallocs, 3); EXPECT_EQ(totalBytes, 60); } EXPECT_EQ(mallocs, 2); EXPECT_EQ(totalBytes, 56); } int main(int argc, char** argv) { Loading Loading
libs/binder/RpcState.cpp +17 −12 Original line number Diff line number Diff line Loading @@ -563,7 +563,7 @@ status_t RpcState::transactAddress(const sp<RpcSession::RpcConnection>& connecti static void cleanup_reply_data(Parcel* p, const uint8_t* data, size_t dataSize, const binder_size_t* objects, size_t objectsCount) { (void)p; delete[] const_cast<uint8_t*>(data - offsetof(RpcWireReply, data)); delete[] const_cast<uint8_t*>(data); (void)dataSize; LOG_ALWAYS_FATAL_IF(objects != nullptr); LOG_ALWAYS_FATAL_IF(objectsCount != 0, "%zu objects remaining", objectsCount); Loading @@ -585,25 +585,30 @@ status_t RpcState::waitForReply(const sp<RpcSession::RpcConnection>& connection, return status; } CommandData data(command.bodySize); if (!data.valid()) return NO_MEMORY; iovec iov{data.data(), command.bodySize}; if (status_t status = rpcRec(connection, session, "reply body", &iov, 1); status != OK) return status; if (command.bodySize < sizeof(RpcWireReply)) { ALOGE("Expecting %zu but got %" PRId32 " bytes for RpcWireReply. Terminating!", sizeof(RpcWireReply), command.bodySize); (void)session->shutdownAndWait(false); return BAD_VALUE; } RpcWireReply* rpcReply = reinterpret_cast<RpcWireReply*>(data.data()); if (rpcReply->status != OK) return rpcReply->status; RpcWireReply rpcReply; CommandData data(command.bodySize - sizeof(RpcWireReply)); if (!data.valid()) return NO_MEMORY; iovec iovs[]{ {&rpcReply, sizeof(RpcWireReply)}, {data.data(), data.size()}, }; if (status_t status = rpcRec(connection, session, "reply body", iovs, arraysize(iovs)); status != OK) return status; if (rpcReply.status != OK) return rpcReply.status; uint8_t* parcelData = data.data(); size_t parcelDataSize = data.size(); data.release(); reply->rpcSetDataReference(session, rpcReply->data, command.bodySize - offsetof(RpcWireReply, data), cleanup_reply_data); reply->rpcSetDataReference(session, parcelData, parcelDataSize, cleanup_reply_data); return OK; } Loading
libs/binder/RpcWireFormat.h +0 −1 Original line number Diff line number Diff line Loading @@ -139,7 +139,6 @@ static_assert(sizeof(RpcWireTransaction) == 40); struct RpcWireReply { int32_t status; // transact return uint8_t data[]; }; static_assert(sizeof(RpcWireReply) == 4); Loading
libs/binder/tests/binderAllocationLimits.cpp +9 −7 Original line number Diff line number Diff line Loading @@ -203,13 +203,15 @@ TEST(RpcBinderAllocation, SetupRpcServer) { auto remoteBinder = session->getRootObject(); size_t mallocs = 0, totalBytes = 0; { const auto on_malloc = OnMalloc([&](size_t bytes) { mallocs++; totalBytes += bytes; }); CHECK_EQ(OK, remoteBinder->pingBinder()); EXPECT_EQ(mallocs, 3); EXPECT_EQ(totalBytes, 60); } EXPECT_EQ(mallocs, 2); EXPECT_EQ(totalBytes, 56); } int main(int argc, char** argv) { Loading