parcel provides protected interfaces EnsureObjectsCapacity & WriteObjectOffset

Signed-off-by: liubb_0516 <liubeibei8@huawei.com>
This commit is contained in:
liubb_0516
2022-05-23 11:31:42 +08:00
parent 39b85e0791
commit 74ccf06136
4 changed files with 4 additions and 92 deletions
-9
View File
@@ -40,13 +40,4 @@ struct parcel_flat_binder_object {
binder_uintptr_t cookie;
};
#ifndef B_PACK_CHARS
#define B_PACK_CHARS(c1, c2, c3, c4) ((((c1) << 24)) | (((c2) << 16)) | (((c3) << 8)) | (c4))
#endif
#ifndef B_TYPE_LARGE
#define B_TYPE_LARGE 0x85
#endif
#define PARCEL_BINDER_TYPE_FD B_PACK_CHARS('f', 'd', '*', B_TYPE_LARGE)
#endif
+4 -5
View File
@@ -297,7 +297,10 @@ public:
bool ReadInt16Unaligned(int16_t &value);
bool ReadUint8Unaligned(uint8_t &value);
bool ReadUint16Unaligned(uint16_t &value);
bool ParcelAppend(Parcel &data);
protected:
bool WriteObjectOffset(binder_size_t offset);
bool EnsureObjectsCapacity();
private:
DISALLOW_COPY_AND_MOVE(Parcel);
@@ -319,8 +322,6 @@ private:
return (((size + SIZE_OFFSET) & (~SIZE_OFFSET)) - size);
}
bool WriteObjectOffset(binder_size_t offset);
size_t CalcNewCapacity(size_t minCapacity);
bool WriteDataBytes(const void *data, size_t size);
@@ -329,8 +330,6 @@ private:
bool EnsureWritableCapacity(size_t desireCapacity);
bool EnsureObjectsCapacity();
bool WriteParcelableOffset(size_t offset);
private:
-41
View File
@@ -12,7 +12,6 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#include <unistd.h>
#include "parcel.h"
#include "securec.h"
@@ -1397,44 +1396,4 @@ bool Parcel::ReadString16Vector(std::vector<std::u16string> *val)
return true;
}
bool Parcel::ParcelAppend(Parcel &data)
{
size_t dataSize = data.GetDataSize();
if (dataSize == 0) {
return true;
}
uintptr_t dataPtr = data.GetData();
size_t writeCursorOld = writeCursor_;
if (EnsureWritableCapacity(dataSize)) {
if (!WriteDataBytes(reinterpret_cast<void *>(dataPtr), dataSize)) {
UTILS_LOGE("Failed to append data whit WriteBuffer");
return false;
}
}
size_t objectSize = data.GetOffsetsSize();
if (objectSize == 0) {
return true;
}
binder_size_t objectOffsets = data.GetObjectOffsets();
auto *newObjectOffsets = reinterpret_cast<binder_size_t *>(objectOffsets);
for (size_t index = 0; index < objectSize; index++) {
if (EnsureObjectsCapacity()) {
size_t offset = writeCursorOld + newObjectOffsets[index];
if (!WriteObjectOffset(offset)) {
UTILS_LOGE("Failed to write object offset");
return false;
}
parcel_flat_binder_object *flat = reinterpret_cast<parcel_flat_binder_object *>(data_ + offset);
if (flat->hdr.type == PARCEL_BINDER_TYPE_FD) {
flat->handle = dup(flat->handle);
}
} else {
UTILS_LOGE("Failed to ensure object capacity");
return false;
}
}
return true;
}
} // namespace OHOS
@@ -967,40 +967,3 @@ HWTEST_F(UtilsParcelTest, test_SetMaxCapacity_002, TestSize.Level0)
ret = parcel.ReadString16Vector(&val);
EXPECT_EQ(false, ret);
}
/**
* @tc.name: test_ParcelAppend
* @tc.desc: test parcel append function.
* @tc.type: FUNC
*/
HWTEST_F(UtilsParcelTest, test_ParcelAppend, TestSize.Level0)
{
Parcel dstParcel, srcParcel;
bool res = dstParcel.ParcelAppend(srcParcel);
ASSERT_TRUE(res);
const int32_t num = 5767168;
const std::string strwrite1 =
"test for write string padded**********************************************************##################";
dstParcel.WriteInt32(num);
dstParcel.WriteString(strwrite1);
srcParcel.WriteInt32(num);
srcParcel.WriteString(strwrite1);
srcParcel.WriteString(strwrite1);
res = dstParcel.ParcelAppend(srcParcel);
ASSERT_TRUE(res);
EXPECT_EQ(num, dstParcel.ReadInt32());
EXPECT_EQ(strwrite1, dstParcel.ReadString());
EXPECT_EQ(num, dstParcel.ReadInt32());
EXPECT_EQ(strwrite1, dstParcel.ReadString());
EXPECT_EQ(strwrite1, dstParcel.ReadString());
res = srcParcel.ParcelAppend(dstParcel);
ASSERT_TRUE(res);
EXPECT_EQ(num, srcParcel.ReadInt32());
EXPECT_EQ(strwrite1, srcParcel.ReadString());
EXPECT_EQ(strwrite1, srcParcel.ReadString());
EXPECT_EQ(num, srcParcel.ReadInt32());
EXPECT_EQ(strwrite1, srcParcel.ReadString());
}