diff options
author | David Monahan <david.monahan@arm.com> | 2023-08-29 09:10:50 +0100 |
---|---|---|
committer | David Monahan <david.monahan@arm.com> | 2023-09-08 10:55:19 +0000 |
commit | 6a1d506cb0619c6bcf8685ada56ddf4507c2f2d4 (patch) | |
tree | be43f5514cf38e06b6dae01886023915dd302eee /src/backends/backendsCommon | |
parent | 564c13dc098eb9353ac15e2609712ab8db9bf350 (diff) | |
download | armnn-6a1d506cb0619c6bcf8685ada56ddf4507c2f2d4.tar.gz |
IVGCVSW-7901 Fix unsafe Usages of Memcpy in Armnn
* Updated usages of Memcpy to use proper checks for null instead of asserts
* Added error checking in places where none existed
Signed-off-by: David Monahan <david.monahan@arm.com>
Change-Id: I9529acd966466ba281f88918be2ec372a756e183
Diffstat (limited to 'src/backends/backendsCommon')
-rw-r--r-- | src/backends/backendsCommon/TensorHandle.cpp | 35 | ||||
-rw-r--r-- | src/backends/backendsCommon/WorkloadUtils.cpp | 20 | ||||
-rw-r--r-- | src/backends/backendsCommon/test/layerTests/ReverseV2TestImpl.cpp | 17 |
3 files changed, 60 insertions, 12 deletions
diff --git a/src/backends/backendsCommon/TensorHandle.cpp b/src/backends/backendsCommon/TensorHandle.cpp index d55fca24d4..bc221adbe3 100644 --- a/src/backends/backendsCommon/TensorHandle.cpp +++ b/src/backends/backendsCommon/TensorHandle.cpp @@ -103,12 +103,30 @@ void ScopedTensorHandle::Allocate() void ScopedTensorHandle::CopyOutTo(void* memory) const { - memcpy(memory, GetTensor<void>(), GetTensorInfo().GetNumBytes()); + const void* src = GetTensor<void>(); + if (src == nullptr) + { + throw NullPointerException("TensorHandle::CopyOutTo called with a null src pointer"); + } + if (memory == nullptr) + { + throw NullPointerException("TensorHandle::CopyOutTo called with a null dest pointer"); + } + memcpy(memory, src, GetTensorInfo().GetNumBytes()); } void ScopedTensorHandle::CopyInFrom(const void* memory) { - memcpy(GetTensor<void>(), memory, GetTensorInfo().GetNumBytes()); + void* dest = GetTensor<void>(); + if (dest == nullptr) + { + throw NullPointerException("TensorHandle::CopyInFrom called with a null dest pointer"); + } + if (memory == nullptr) + { + throw NullPointerException("TensorHandle::CopyInFrom called with a null src pointer"); + } + memcpy(dest, memory, GetTensorInfo().GetNumBytes()); } void ScopedTensorHandle::CopyFrom(const ScopedTensorHandle& other) @@ -118,8 +136,17 @@ void ScopedTensorHandle::CopyFrom(const ScopedTensorHandle& other) void ScopedTensorHandle::CopyFrom(const void* srcMemory, unsigned int numBytes) { - ARMNN_ASSERT(GetTensor<void>() == nullptr); - ARMNN_ASSERT(GetTensorInfo().GetNumBytes() == numBytes); + if (GetTensor<void>() != nullptr) + { + throw NullPointerException("TensorHandle::CopyFrom called on an already allocated TensorHandle"); + } + if (GetTensorInfo().GetNumBytes() != numBytes) + { + std::stringstream msg; + msg << "TensorHandle:CopyFrom: Number of bytes in the tensor info (" << GetTensorInfo().GetNumBytes() << + ") does not match the number of bytes being copied (" << numBytes << ")"; + throw armnn::Exception(msg.str()); + } if (srcMemory) { diff --git a/src/backends/backendsCommon/WorkloadUtils.cpp b/src/backends/backendsCommon/WorkloadUtils.cpp index 3aea667bfe..28d01ec127 100644 --- a/src/backends/backendsCommon/WorkloadUtils.cpp +++ b/src/backends/backendsCommon/WorkloadUtils.cpp @@ -18,8 +18,14 @@ namespace armnn armnn::ConstTensor PermuteTensor(const ConstTensorHandle* tensor, const PermutationVector& permutationVector, void* permuteBuffer) { - ARMNN_ASSERT_MSG(tensor, "Invalid input tensor"); - ARMNN_ASSERT_MSG(permuteBuffer, "Invalid permute buffer"); + if (tensor == nullptr) + { + throw armnn::InvalidArgumentException("WorkloadUtils: PermuteTensor: Null input tensor pointer"); + } + if (permuteBuffer == nullptr) + { + throw armnn::InvalidArgumentException("WorkloadUtils: PermuteTensor: Null permute buffer pointer"); + } TensorInfo tensorInfo = tensor->GetTensorInfo(); @@ -231,8 +237,14 @@ armnn::ConstTensor ConvertWeightTensorFromArmnnToAcl(const ConstTensorHandle* we DataLayout dataLayout, void* permuteBuffer) { - ARMNN_ASSERT_MSG(weightTensor, "Invalid input tensor"); - ARMNN_ASSERT_MSG(permuteBuffer, "Invalid permute buffer"); + if (weightTensor == nullptr) + { + throw armnn::InvalidArgumentException("WorkloadUtils: PermuteTensor: Null input tensor pointer"); + } + if (permuteBuffer == nullptr) + { + throw armnn::InvalidArgumentException("WorkloadUtils: PermuteTensor: Null permute buffer pointer"); + } auto multiplier = weightTensor->GetTensorInfo().GetShape()[0]; auto inputChannels = weightTensor->GetTensorInfo().GetShape()[1]; diff --git a/src/backends/backendsCommon/test/layerTests/ReverseV2TestImpl.cpp b/src/backends/backendsCommon/test/layerTests/ReverseV2TestImpl.cpp index 3cfd614336..f2774037bd 100644 --- a/src/backends/backendsCommon/test/layerTests/ReverseV2TestImpl.cpp +++ b/src/backends/backendsCommon/test/layerTests/ReverseV2TestImpl.cpp @@ -63,13 +63,22 @@ namespace axisHandle->Allocate(); outputHandle->Allocate(); - CopyDataToITensorHandle(inputHandle.get(), input.data()); - CopyDataToITensorHandle(axisHandle.get(), axis.data()); + if (input.data() != nullptr) + { + CopyDataToITensorHandle(inputHandle.get(), input.data()); + } + if (axis.data() != nullptr) + { + CopyDataToITensorHandle(axisHandle.get(), axis.data()); + } workload->PostAllocationConfigure(); ExecuteWorkload(*workload, memoryManager); - CopyDataFromITensorHandle(outputActual.data(), outputHandle.get()); + if (outputActual.data() != nullptr) + { + CopyDataFromITensorHandle(outputActual.data(), outputHandle.get()); + } return LayerTestResult<T, NumDims>(outputActual, outputExpected, @@ -98,7 +107,7 @@ LayerTestResult<T, 2> ReverseV2SimpleTestEmptyAxis( 3, 4 }, qScale, qOffset); - std::vector<int> axis = armnnUtils::QuantizedVector<int>({}, qScale, qOffset); + std::vector<int> axis = armnnUtils::QuantizedVector<int>({1, 1}, qScale, qOffset); std::vector<T> outputExpected = armnnUtils::QuantizedVector<T>({ 1, 2, |