diff --git a/.gitmodules b/.gitmodules
new file mode 100644
index 0000000..6c3a6b9
--- /dev/null
+++ b/.gitmodules
@@ -0,0 +1,3 @@
+[submodule "gpu_transform/src/main/cpp/boundscheck/third_party_bounds_checking_function"]
+ path = gpu_transform/src/main/cpp/boundscheck/third_party_bounds_checking_function
+ url = https://gitee.com/openharmony/third_party_bounds_checking_function.git
diff --git a/OAT.xml b/OAT.xml
index db4b883..2a52dc9 100644
--- a/OAT.xml
+++ b/OAT.xml
@@ -28,6 +28,7 @@
+
@@ -38,6 +39,7 @@
+
diff --git a/gpu_transform/src/main/cpp/CMakeLists.txt b/gpu_transform/src/main/cpp/CMakeLists.txt
index cf783b1..0751911 100644
--- a/gpu_transform/src/main/cpp/CMakeLists.txt
+++ b/gpu_transform/src/main/cpp/CMakeLists.txt
@@ -11,8 +11,11 @@ include_directories(${NATIVERENDER_ROOT_PATH}
${NATIVERENDER_ROOT_PATH}/common
${NATIVERENDER_ROOT_PATH}/render
${NATIVERENDER_ROOT_PATH}/constant
+ ${NATIVERENDER_ROOT_PATH}/boundscheck
)
+add_subdirectory(boundscheck)
+
add_library(nativeGpu SHARED
${NATIVERENDER_ROOT_PATH}/napi/napi_init.cpp
${NATIVERENDER_ROOT_PATH}/render/EGLRender.cpp
@@ -30,4 +33,4 @@ find_library (
GLES-lib
GLESv3 )
-target_link_libraries(nativeGpu PUBLIC ${hilog-lib} ${EGL-lib} ${GLES-lib} libace_napi.z.so libc++.a -s -ftrapv)
\ No newline at end of file
+target_link_libraries(nativeGpu PUBLIC boundscheck ${hilog-lib} ${EGL-lib} ${GLES-lib} libace_napi.z.so -s -ftrapv)
\ No newline at end of file
diff --git a/gpu_transform/src/main/cpp/boundscheck/CMakeLists.txt b/gpu_transform/src/main/cpp/boundscheck/CMakeLists.txt
new file mode 100644
index 0000000..6cd48c8
--- /dev/null
+++ b/gpu_transform/src/main/cpp/boundscheck/CMakeLists.txt
@@ -0,0 +1,25 @@
+# the minimum version of CMake.
+cmake_minimum_required(VERSION 3.4.1)
+
+set(can_use_assembler TRUE)
+enable_language(ASM)
+IF("${OHOS_ARCH}" STREQUAL "arm64-v8a")
+ SET(ASM_OPTIONS "-x assembler-with-cpp")
+ SET(CMAKE_ASM_FLAGS "${CFLAGS} ${ASM_OPTIONS} -march=armv8+crypto -D__OHOS__")
+ENDIF()
+
+project(boundscheck)
+
+set(TAGET_BOUNDSCHECK_SRC_PATH ${CMAKE_CURRENT_SOURCE_DIR}/third_party_bounds_checking_function/src)
+
+add_library(boundscheck
+ STATIC
+ ${TAGET_BOUNDSCHECK_SRC_PATH}/memcpy_s.c
+ ${TAGET_BOUNDSCHECK_SRC_PATH}/memset_s.c
+ ${TAGET_BOUNDSCHECK_SRC_PATH}/securecutil.c)
+
+include_directories(${TAGET_BOUNDSCHECK_SRC_PATH}
+ ${CMAKE_CURRENT_SOURCE_DIR}/third_party_bounds_checking_function/include
+ )
+
+target_link_libraries(boundscheck)
diff --git a/gpu_transform/src/main/cpp/boundscheck/third_party_bounds_checking_function b/gpu_transform/src/main/cpp/boundscheck/third_party_bounds_checking_function
new file mode 160000
index 0000000..a45b3ac
--- /dev/null
+++ b/gpu_transform/src/main/cpp/boundscheck/third_party_bounds_checking_function
@@ -0,0 +1 @@
+Subproject commit a45b3aceed2c0138babc951850445d1cd010ce48
diff --git a/gpu_transform/src/main/cpp/render/EGLRender.cpp b/gpu_transform/src/main/cpp/render/EGLRender.cpp
index 0a051de..f0ef9b2 100644
--- a/gpu_transform/src/main/cpp/render/EGLRender.cpp
+++ b/gpu_transform/src/main/cpp/render/EGLRender.cpp
@@ -535,7 +535,10 @@ void EGLRender::SetImageData(uint8_t *pData, int width, int height)
m_RenderImage.height = height;
m_RenderImage.format = IMAGE_FORMAT_RGBA;
NativeImageUtil::AllocNativeImage(&m_RenderImage);
- memcpy(m_RenderImage.ppPlane[0], pData, width * height * DEFAULT_FOUR);
+ if (memcpy_s(m_RenderImage.ppPlane[0],
+ width * height * DEFAULT_FOUR, pData, width * height * DEFAULT_FOUR) != EOK) {
+ return;
+ }
glBindTexture(GL_TEXTURE_2D, m_ImageTextureId);
glTexImage2D(GL_TEXTURE_2D,
diff --git a/gpu_transform/src/main/cpp/util/NapiUtil.cpp b/gpu_transform/src/main/cpp/util/NapiUtil.cpp
index eba879f..271e7b2 100644
--- a/gpu_transform/src/main/cpp/util/NapiUtil.cpp
+++ b/gpu_transform/src/main/cpp/util/NapiUtil.cpp
@@ -26,6 +26,7 @@
#include
#include
#include "DebugLog.h"
+#include "third_party_bounds_checking_function/include/securec.h"
const int32_t MAX_STR_LENGTH = 1024;
@@ -41,7 +42,7 @@ void NapiUtil::JsValueToString(const napi_env &env, const napi_value &value, con
LOGI("%s nullptr js object to string malloc failed", __func__);
return;
}
- (void) memset(buf.get(), 0, bufLen);
+ (void) memset_s(buf.get(), bufLen, 0, bufLen);
size_t result = 0;
napi_get_value_string_utf8(env, value, buf.get(), bufLen, &result);
target = buf.get();
diff --git a/gpu_transform/src/main/cpp/util/NativeImage.h b/gpu_transform/src/main/cpp/util/NativeImage.h
index d79018d..c97c0f1 100644
--- a/gpu_transform/src/main/cpp/util/NativeImage.h
+++ b/gpu_transform/src/main/cpp/util/NativeImage.h
@@ -30,6 +30,7 @@
#include
#include "DebugLog.h"
#include "constant/constant_shape.h"
+#include "third_party_bounds_checking_function/include/securec.h"
#define IMAGE_FORMAT_RGBA 0x01
#define IMAGE_FORMAT_NV21 0x02
@@ -48,7 +49,7 @@
#define IMAGE_FORMAT_GRAY_EXT "GRAY"
#define IMAGE_FORMAT_I444_EXT "I444"
#define IMAGE_FORMAT_P010_EXT "P010" // 16bit NV21
-
+#define EOK 0
struct NativeImage {
int width;
@@ -140,7 +141,9 @@ public:
if (napi_create_arraybuffer(env, srcLen, &nativePtr, res) != napi_ok || nativePtr == nullptr) {
return false;
}
- memcpy(nativePtr, src, srcLen);
+ if (memcpy_s(nativePtr, srcLen, src, srcLen) != EOK) {
+ return false;
+ }
return true;
}
@@ -149,10 +152,17 @@ public:
int totalLength = width * height * DEFAULT_FOUR;
int oneLineLength = width * DEFAULT_FOUR;
uint8_t* tmp = (uint8_t*)malloc(totalLength);
- memcpy(tmp, *buf, totalLength);
- memset(*buf, DEFAULT_ZERO, sizeof(uint8_t)*totalLength);
+ if (memcpy_s(tmp, totalLength, *buf, totalLength) != EOK) {
+ return;
+ }
+ if (memset_s(*buf, sizeof(uint8_t)*totalLength, DEFAULT_ZERO, sizeof(uint8_t)*totalLength) != EOK) {
+ return;
+ }
for (int i = 0; i < height; i++) {
- memcpy(*buf + oneLineLength * i, tmp + totalLength - oneLineLength * (i+1), oneLineLength);
+ if (memcpy_s(*buf + oneLineLength * i, oneLineLength,
+ tmp + totalLength - oneLineLength * (i+1), oneLineLength) != EOK) {
+ break;
+ }
}
free(tmp);
}