aboutsummaryrefslogtreecommitdiff
path: root/src/backends/backendsCommon
diff options
context:
space:
mode:
authorDavid Monahan <david.monahan@arm.com>2023-08-29 09:10:50 +0100
committerDavid Monahan <david.monahan@arm.com>2023-09-08 10:55:19 +0000
commit6a1d506cb0619c6bcf8685ada56ddf4507c2f2d4 (patch)
treebe43f5514cf38e06b6dae01886023915dd302eee /src/backends/backendsCommon
parent564c13dc098eb9353ac15e2609712ab8db9bf350 (diff)
downloadarmnn-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.cpp35
-rw-r--r--src/backends/backendsCommon/WorkloadUtils.cpp20
-rw-r--r--src/backends/backendsCommon/test/layerTests/ReverseV2TestImpl.cpp17
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,