Fix RS HIDL client to correctly treat data passing by bytes.
Our current stack:
API->API_TO_HAL_translator-> HAL
->HAL_TO_Implementation_translator->Implementation
For most APIs:
- API passes objectCount.
- HAL expects objectCount.
- Implementation expects objectCount.
For APIs like ScriptGroupCreate:
- API passes byteCount. And unfortunately, these APIs are part of
NDK, we could not make them also passing objectCount like others.
- HAL expects objectCount.
- Implementation expects byteCount.
So that both API_TO_HAL_translator and
HAL_TO_Implementation_translator should correctly convert input
objectCount/byteCount to byteCount/objectCount.
This CL only fixes the API_TO_HAL_translator part.
API_TO_HAL_translator was mistakenly using byteCount as
objectCount, causing potential out-of-bound access.
Bug: 36404879
Test: mm
Change-Id: Ic3d4e6f4cfaa81239e9f732e739d5a79e08b1b64
diff --git a/rsHidlAdaptation.cpp b/rsHidlAdaptation.cpp
index 2960de1..2ec1069 100644
--- a/rsHidlAdaptation.cpp
+++ b/rsHidlAdaptation.cpp
@@ -909,7 +909,7 @@
uint64_t _ve = (uint64_t)(uintptr_t)ve;
hidl_vec<uint32_t> _dims;
- _dims.setToExternal(const_cast<uint32_t *>(dims), len);
+ _dims.setToExternal(const_cast<uint32_t *>(dims), dimLen / sizeof(uint32_t));
GetIContextHandle(context)->scriptSetVarVE(_script, slot, _data, _ve, _dims);
}
@@ -965,26 +965,26 @@
RsScriptFieldID * dstF, size_t dstFSize,
const RsType * type, size_t typeSize)
{
- std::vector<ScriptKernelID> _kernels(kernelsSize);
- std::vector<ScriptKernelID> _src(srcSize);
- std::vector<ScriptKernelID> _dstK(dstKSize);
- std::vector<ScriptFieldID> _dstF(dstFSize);
- std::vector<Type> _type(typeSize);
+ std::vector<ScriptKernelID> _kernels(kernelsSize / sizeof(RsScriptKernelID));
+ std::vector<ScriptKernelID> _src(srcSize / sizeof(RsScriptKernelID));
+ std::vector<ScriptKernelID> _dstK(dstKSize / sizeof(RsScriptKernelID));
+ std::vector<ScriptFieldID> _dstF(dstFSize / sizeof(RsScriptFieldID));
+ std::vector<Type> _type(typeSize / sizeof(RsType));
- for (size_t i = 0; i < kernelsSize; i++) {
+ for (size_t i = 0; i < _kernels.size(); i++) {
_kernels[i] = (ScriptKernelID)(uintptr_t)kernels[i];
}
- for (size_t i = 0; i < srcSize; i++) {
+ for (size_t i = 0; i < _src.size(); i++) {
_src[i] = (ScriptKernelID)(uintptr_t)src[i];
}
- for (size_t i = 0; i < dstKSize; i++) {
+ for (size_t i = 0; i < _dstK.size(); i++) {
_dstK[i] = (ScriptKernelID)(uintptr_t)dstK[i];
}
- for (size_t i = 0; i < dstFSize; i++) {
- _dstF[i] = (ScriptKernelID)(uintptr_t)dstF[i];
+ for (size_t i = 0; i < _dstF.size(); i++) {
+ _dstF[i] = (ScriptFieldID)(uintptr_t)dstF[i];
}
- for (size_t i = 0; i < typeSize; i++) {
- _type[i] = (ScriptKernelID)(uintptr_t)type[i];
+ for (size_t i = 0; i < _type.size(); i++) {
+ _type[i] = (Type)(uintptr_t)type[i];
}
uint64_t scriptGroup = GetIContextHandle(context)->scriptGroupCreate(_kernels, _src, _dstK, _dstF, _type);
@@ -1091,7 +1091,7 @@
uint64_t _alloc = (uint64_t)(uintptr_t)alloc;
hidl_vec<uint32_t> _offsets;
- _offsets.setToExternal(const_cast<uint32_t *>(offsets), offsets_length);
+ _offsets.setToExternal(const_cast<uint32_t *>(offsets), offsets_length / sizeof(uint32_t));
GetIContextHandle(context)->allocationAdapterOffset(_alloc, _offsets);
}