mirror of
https://github.com/openharmony/utils_native.git
synced 2026-07-21 01:25:42 -04:00
parcel provides protected interfaces EnsureObjectsCapacity & WriteObjectOffset
Signed-off-by: liubb_0516 <liubeibei8@huawei.com>
This commit is contained in:
@@ -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
|
||||
|
||||
@@ -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:
|
||||
|
||||
@@ -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());
|
||||
}
|
||||
Reference in New Issue
Block a user