diff --git a/camera/metadata/include/camera_metadata_info.h b/camera/metadata/include/camera_metadata_info.h index dd0e43044fc709e602c696d76e0022823b298ee7..042d020e24274597eb1a7671f71c4f4876493f47 100644 --- a/camera/metadata/include/camera_metadata_info.h +++ b/camera/metadata/include/camera_metadata_info.h @@ -109,7 +109,7 @@ public: static uint32_t GetCameraMetadataDataSize(const common_metadata_header_t *metadata_header); static int32_t CopyCameraMetadataItems(common_metadata_header_t *newMetadata, const common_metadata_header_t *oldMetadata); - static size_t CalculateCameraMetadataItemDataSize(uint32_t type, size_t data_count); + static int32_t CalculateCameraMetadataItemDataSize(uint32_t type, size_t data_count); static int32_t GetCameraMetadataItemType(uint32_t item, uint32_t *data_type); static common_metadata_header_t *FillCameraMetadata(common_metadata_header_t *buffer, size_t memoryRequired, uint32_t itemCapacity, uint32_t dataCapacity); diff --git a/camera/metadata/include/camera_metadata_operator.h b/camera/metadata/include/camera_metadata_operator.h index 3b1e4e65fe1446f5ff3c61e1025a3d0a2c616fae..2684822f03e17a5815f50764b8d7c2520b7cefd0 100644 --- a/camera/metadata/include/camera_metadata_operator.h +++ b/camera/metadata/include/camera_metadata_operator.h @@ -201,7 +201,7 @@ uint32_t GetCameraMetadataItemCapacity(const common_metadata_header_t *metadata_ uint32_t GetCameraMetadataDataSize(const common_metadata_header_t *metadata_header); int32_t CopyCameraMetadataItems(common_metadata_header_t *newMetadata, const common_metadata_header_t *oldMetadata); -size_t CalculateCameraMetadataItemDataSize(uint32_t type, size_t data_count); +int32_t CalculateCameraMetadataItemDataSize(uint32_t type, size_t data_count); int32_t GetCameraMetadataItemType(uint32_t item, uint32_t *data_type); common_metadata_header_t *FillCameraMetadata(common_metadata_header_t *buffer, size_t memoryRequired, uint32_t itemCapacity, uint32_t dataCapacity); diff --git a/camera/metadata/src/camera_metadata_info.cpp b/camera/metadata/src/camera_metadata_info.cpp index 68903153b3f1b07820ac671b212e05168126b33c..b5d8e3d63826320e972944202e60d7417be0f964 100644 --- a/camera/metadata/src/camera_metadata_info.cpp +++ b/camera/metadata/src/camera_metadata_info.cpp @@ -376,7 +376,11 @@ bool CameraMetadata::resize_add_metadata(uint32_t item, const void *data, size_t METADATA_ERR_LOG("GetCameraMetadataItemType invalid item type"); return false; } - size_t size = CalculateCameraMetadataItemDataSize(data_type, data_count); + int32_t size = CalculateCameraMetadataItemDataSize(data_type, data_count); + if (size == CAM_META_FAILURE) { + METADATA_ERR_LOG("CalculateCameraMetadataItemDataSize invalid datatype:%{public}d", data_type); + return false + } common_metadata_header_t *newMetadata = AllocateCameraMetadataBuffer((itemCapacity + 1) * INDEX_COUNTER, AlignTo((data_capacity + size) * INDEX_COUNTER, DATA_ALIGNMENT)); @@ -682,12 +686,12 @@ const char *CameraMetadata::GetCameraMetadataItemName(uint32_t item) return g_ohosItemInfo[section][itemIndex].item_name; } -size_t CameraMetadata::CalculateCameraMetadataItemDataSize(uint32_t type, size_t dataCount) +int32_t CameraMetadata::CalculateCameraMetadataItemDataSize(uint32_t type, size_t dataCount) { METADATA_DEBUG_LOG("CalculateCameraMetadataItemDataSize start"); if (type < META_TYPE_BYTE || type >= META_NUM_TYPES) { METADATA_ERR_LOG("CalculateCameraMetadataItemDataSize invalid type"); - return 0; + return CAM_META_FAILURE; } size_t dataBytes = dataCount * OHOS_CAMERA_METADATA_TYPE_SIZE[type]; @@ -728,6 +732,11 @@ int CameraMetadata::AddCameraMetadataItemVerify(common_metadata_header_t *dst, METADATA_ERR_LOG("AddCameraMetadataItemVerify invalid item type"); return CAM_META_INVALID_PARAM; } + + if (*dataType < META_TYPE_BYTE || *dataType >= META_NUM_TYPES) { + METADATA_ERR_LOG("AddCameraMetadataItemVerify invalid type"); + return CAM_META_INVALID_PARAM + } return CAM_META_SUCCESS; } @@ -746,7 +755,7 @@ int CameraMetadata::AddCameraMetadataItem(common_metadata_header_t *dst, uint32_ return CAM_META_INVALID_PARAM; } - size_t dataBytes = CalculateCameraMetadataItemDataSize(dataType, dataCount); + int32_t dataBytes = CalculateCameraMetadataItemDataSize(dataType, dataCount); if (dataBytes + dst->data_count > dst->data_capacity) { METADATA_ERR_LOG("AddCameraMetadataItem data_capacity limit reached"); return CAM_META_DATA_CAP_EXCEED; @@ -816,9 +825,12 @@ int CameraMetadata::GetCameraMetadataItem(const common_metadata_header_t *src, u item->data_type = localItem->data_type; item->count = localItem->count; - size_t dataBytes = CalculateCameraMetadataItemDataSize(localItem->data_type, localItem->count); + int32_t dataBytes = CalculateCameraMetadataItemDataSize(localItem->data_type, localItem->count); if (dataBytes == 0) { item->data.u8 = localItem->data.value; + } else if (dataBytes == CAM_META_FAILURE) { + METADATA_ERR_LOG("GetCameraMetadataItem invalid datatype:%{public}d", localItem->data_type); + return CAM_META_FAILURE; } else { uint8_t *srcMetadataData = GetMetadataData(src); if (srcMetadataData == nullptr) { @@ -959,9 +971,9 @@ int CameraMetadata::UpdateameraMetadataItemSize(camera_metadata_item_entry_t *it METADATA_ERR_LOG("UpdateameraMetadataItemSize invalid item"); return CAM_META_FAILURE; } - size_t dataSize = CalculateCameraMetadataItemDataSize(item->data_type, dataCount); + int32_t dataSize = CalculateCameraMetadataItemDataSize(item->data_type, dataCount); size_t dataPayloadSize = dataCount * OHOS_CAMERA_METADATA_TYPE_SIZE[item->data_type]; - size_t oldItemSize = CalculateCameraMetadataItemDataSize(item->data_type, item->count); + int32_t oldItemSize = CalculateCameraMetadataItemDataSize(item->data_type, item->count); int32_t ret = CAM_META_SUCCESS; if (dataSize != oldItemSize) { if (dst->data_capacity < (dst->data_count + dataSize - oldItemSize)) { @@ -1095,7 +1107,7 @@ int CameraMetadata::DeleteCameraMetadataItemByIndex(common_metadata_header_t *ds int32_t ret = CAM_META_SUCCESS; camera_metadata_item_entry_t *itemToDelete = GetMetadataItems(dst) + index; - size_t dataBytes = CalculateCameraMetadataItemDataSize(itemToDelete->data_type, itemToDelete->count); + int32_t dataBytes = CalculateCameraMetadataItemDataSize(itemToDelete->data_type, itemToDelete->count); if (dataBytes > 0) { ret = moveMetadataMemery(dst, itemToDelete, dataBytes); if (ret != CAM_META_SUCCESS) { @@ -1111,6 +1123,9 @@ int CameraMetadata::DeleteCameraMetadataItemByIndex(common_metadata_header_t *ds metadataItems->data.offset -= dataBytes; } } + } else if (dataBytes == CAM_META_FAILURE) { + METADATA_ERR_LOG("DeleteCameraMetadataItemByIndex invalid datatype:%{public}d", itemToDelete->data_type); + return CAM_META_FAILURE; } uint64_t length = sizeof(camera_metadata_item_entry_t) * (dst->item_count - index - 1); diff --git a/camera/metadata/src/camera_metadata_operator.cpp b/camera/metadata/src/camera_metadata_operator.cpp index 26dee9218223d05ea9418d207122558dc42e508e..5a7056a06e5eb7d6c1f507e1873449da0dca5d15 100644 --- a/camera/metadata/src/camera_metadata_operator.cpp +++ b/camera/metadata/src/camera_metadata_operator.cpp @@ -52,7 +52,7 @@ const char *GetCameraMetadataItemName(uint32_t item) return CameraMetadata::GetCameraMetadataItemName(item); } -size_t CalculateCameraMetadataItemDataSize(uint32_t type, size_t dataCount) +int32_t CalculateCameraMetadataItemDataSize(uint32_t type, size_t dataCount) { return CameraMetadata::CalculateCameraMetadataItemDataSize(type, dataCount); }