Loading libs/binder/include/binder/SafeInterface.h +6 −0 Original line number Diff line number Diff line Loading @@ -152,6 +152,12 @@ public: return callParcel("writeParcelableVector", [&]() { return parcel->writeParcelableVector(v); }); } status_t read(const Parcel& parcel, float* f) const { return callParcel("readFloat", [&]() { return parcel.readFloat(f); }); } status_t write(Parcel* parcel, float f) const { return callParcel("writeFloat", [&]() { return parcel->writeFloat(f); }); } // Templates to handle integral types. We use a struct template to require that the called // function exactly matches the signedness and size of the argument (e.g., the argument isn't Loading libs/binder/tests/binderSafeInterfaceTest.cpp +24 −0 Original line number Diff line number Diff line Loading @@ -229,6 +229,7 @@ public: IncrementUint32, IncrementInt64, IncrementUint64, IncrementFloat, IncrementTwo, Last, }; Loading Loading @@ -259,6 +260,7 @@ public: virtual status_t increment(uint32_t a, uint32_t* aPlusOne) const = 0; virtual status_t increment(int64_t a, int64_t* aPlusOne) const = 0; virtual status_t increment(uint64_t a, uint64_t* aPlusOne) const = 0; virtual status_t increment(float a, float* aPlusOne) const = 0; // This tests that input/output parameter interleaving works correctly virtual status_t increment(int32_t a, int32_t* aPlusOne, int32_t b, Loading Loading @@ -353,6 +355,11 @@ public: using Signature = status_t (ISafeInterfaceTest::*)(uint64_t, uint64_t*) const; return callRemote<Signature>(Tag::IncrementUint64, a, aPlusOne); } status_t increment(float a, float* aPlusOne) const override { ALOG(LOG_INFO, getLogTag(), "%s", __PRETTY_FUNCTION__); using Signature = status_t (ISafeInterfaceTest::*)(float, float*) const; return callRemote<Signature>(Tag::IncrementFloat, a, aPlusOne); } status_t increment(int32_t a, int32_t* aPlusOne, int32_t b, int32_t* bPlusOne) const override { ALOG(LOG_INFO, getLogTag(), "%s", __PRETTY_FUNCTION__); using Signature = Loading Loading @@ -474,6 +481,11 @@ public: *aPlusOne = a + 1; return NO_ERROR; } status_t increment(float a, float* aPlusOne) const override { ALOG(LOG_INFO, getLogTag(), "%s", __PRETTY_FUNCTION__); *aPlusOne = a + 1.0f; return NO_ERROR; } status_t increment(int32_t a, int32_t* aPlusOne, int32_t b, int32_t* bPlusOne) const override { ALOG(LOG_INFO, getLogTag(), "%s", __PRETTY_FUNCTION__); *aPlusOne = a + 1; Loading Loading @@ -555,6 +567,10 @@ public: using Signature = status_t (ISafeInterfaceTest::*)(uint64_t, uint64_t*) const; return callLocal<Signature>(data, reply, &ISafeInterfaceTest::increment); } case ISafeInterfaceTest::Tag::IncrementFloat: { using Signature = status_t (ISafeInterfaceTest::*)(float, float*) const; return callLocal<Signature>(data, reply, &ISafeInterfaceTest::increment); } case ISafeInterfaceTest::Tag::IncrementTwo: { using Signature = status_t (ISafeInterfaceTest::*)(int32_t, int32_t*, int32_t, int32_t*) const; Loading Loading @@ -804,6 +820,14 @@ TEST_F(SafeInterfaceTest, TestIncrementUint64) { ASSERT_EQ(a + 1, aPlusOne); } TEST_F(SafeInterfaceTest, TestIncrementFloat) { const float a = 1.0f; float aPlusOne = 0.0f; status_t result = mSafeInterfaceTest->increment(a, &aPlusOne); ASSERT_EQ(NO_ERROR, result); ASSERT_EQ(a + 1.0f, aPlusOne); } TEST_F(SafeInterfaceTest, TestIncrementTwo) { const int32_t a = 1; int32_t aPlusOne = 0; Loading Loading
libs/binder/include/binder/SafeInterface.h +6 −0 Original line number Diff line number Diff line Loading @@ -152,6 +152,12 @@ public: return callParcel("writeParcelableVector", [&]() { return parcel->writeParcelableVector(v); }); } status_t read(const Parcel& parcel, float* f) const { return callParcel("readFloat", [&]() { return parcel.readFloat(f); }); } status_t write(Parcel* parcel, float f) const { return callParcel("writeFloat", [&]() { return parcel->writeFloat(f); }); } // Templates to handle integral types. We use a struct template to require that the called // function exactly matches the signedness and size of the argument (e.g., the argument isn't Loading
libs/binder/tests/binderSafeInterfaceTest.cpp +24 −0 Original line number Diff line number Diff line Loading @@ -229,6 +229,7 @@ public: IncrementUint32, IncrementInt64, IncrementUint64, IncrementFloat, IncrementTwo, Last, }; Loading Loading @@ -259,6 +260,7 @@ public: virtual status_t increment(uint32_t a, uint32_t* aPlusOne) const = 0; virtual status_t increment(int64_t a, int64_t* aPlusOne) const = 0; virtual status_t increment(uint64_t a, uint64_t* aPlusOne) const = 0; virtual status_t increment(float a, float* aPlusOne) const = 0; // This tests that input/output parameter interleaving works correctly virtual status_t increment(int32_t a, int32_t* aPlusOne, int32_t b, Loading Loading @@ -353,6 +355,11 @@ public: using Signature = status_t (ISafeInterfaceTest::*)(uint64_t, uint64_t*) const; return callRemote<Signature>(Tag::IncrementUint64, a, aPlusOne); } status_t increment(float a, float* aPlusOne) const override { ALOG(LOG_INFO, getLogTag(), "%s", __PRETTY_FUNCTION__); using Signature = status_t (ISafeInterfaceTest::*)(float, float*) const; return callRemote<Signature>(Tag::IncrementFloat, a, aPlusOne); } status_t increment(int32_t a, int32_t* aPlusOne, int32_t b, int32_t* bPlusOne) const override { ALOG(LOG_INFO, getLogTag(), "%s", __PRETTY_FUNCTION__); using Signature = Loading Loading @@ -474,6 +481,11 @@ public: *aPlusOne = a + 1; return NO_ERROR; } status_t increment(float a, float* aPlusOne) const override { ALOG(LOG_INFO, getLogTag(), "%s", __PRETTY_FUNCTION__); *aPlusOne = a + 1.0f; return NO_ERROR; } status_t increment(int32_t a, int32_t* aPlusOne, int32_t b, int32_t* bPlusOne) const override { ALOG(LOG_INFO, getLogTag(), "%s", __PRETTY_FUNCTION__); *aPlusOne = a + 1; Loading Loading @@ -555,6 +567,10 @@ public: using Signature = status_t (ISafeInterfaceTest::*)(uint64_t, uint64_t*) const; return callLocal<Signature>(data, reply, &ISafeInterfaceTest::increment); } case ISafeInterfaceTest::Tag::IncrementFloat: { using Signature = status_t (ISafeInterfaceTest::*)(float, float*) const; return callLocal<Signature>(data, reply, &ISafeInterfaceTest::increment); } case ISafeInterfaceTest::Tag::IncrementTwo: { using Signature = status_t (ISafeInterfaceTest::*)(int32_t, int32_t*, int32_t, int32_t*) const; Loading Loading @@ -804,6 +820,14 @@ TEST_F(SafeInterfaceTest, TestIncrementUint64) { ASSERT_EQ(a + 1, aPlusOne); } TEST_F(SafeInterfaceTest, TestIncrementFloat) { const float a = 1.0f; float aPlusOne = 0.0f; status_t result = mSafeInterfaceTest->increment(a, &aPlusOne); ASSERT_EQ(NO_ERROR, result); ASSERT_EQ(a + 1.0f, aPlusOne); } TEST_F(SafeInterfaceTest, TestIncrementTwo) { const int32_t a = 1; int32_t aPlusOne = 0; Loading