From: Jaeyun Jung Date: Wed, 14 Aug 2024 06:24:07 +0000 (+0900) Subject: [ITC][Non-ACR][Machine Learning] fix double-free error X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=refs%2Fchanges%2F51%2F316151%2F1;p=test%2Ftct%2Fnative%2Fapi.git [ITC][Non-ACR][Machine Learning] fix double-free error In ml-single inference testcase, global handle is used to create and to infer the model. This causes double-free issue. Declare local handle and use it for testcase. Also, add release code for tensors-info handle to fix mem leak case. Change-Id: I3d031b687f1c102f339e38992144f9b276fd7728 Signed-off-by: Jaeyun Jung --- diff --git a/src/itc/nnstreamer/ITs-nnstreamer-single.c b/src/itc/nnstreamer/ITs-nnstreamer-single.c index aecb7f772..0efbb2a4f 100755 --- a/src/itc/nnstreamer/ITs-nnstreamer-single.c +++ b/src/itc/nnstreamer/ITs-nnstreamer-single.c @@ -450,7 +450,7 @@ int ITc_nnstreamer_single_ml_get_output_info_p(void) CHECK_HANDLE_CLEANUP(hGetOutputTensorsInfoHandle, "ml_single_get_output_info",ml_single_close (hSingleHandle);ml_tensors_info_destroy (hInputTensorsInfoHandle);ml_tensors_info_destroy (hOutputTensorsInfoHandle)); nRet = ml_single_close (hSingleHandle); - PRINT_RESULT_CLEANUP(ML_ERROR_NONE, nRet, "ml_single_close", NnStreamerGetError(nRet),ml_tensors_info_destroy (hInputTensorsInfoHandle);ml_tensors_info_destroy (hOutputTensorsInfoHandle)); + PRINT_RESULT_CLEANUP(ML_ERROR_NONE, nRet, "ml_single_close", NnStreamerGetError(nRet),ml_tensors_info_destroy (hInputTensorsInfoHandle);ml_tensors_info_destroy (hOutputTensorsInfoHandle);ml_tensors_info_destroy (hGetOutputTensorsInfoHandle)); nRet = ml_tensors_info_destroy (hInputTensorsInfoHandle); PRINT_RESULT_NORETURN(ML_ERROR_NONE, nRet, "ml_tensors_info_destroy", NnStreamerGetError(nRet)); @@ -458,6 +458,9 @@ int ITc_nnstreamer_single_ml_get_output_info_p(void) nRet = ml_tensors_info_destroy (hOutputTensorsInfoHandle); PRINT_RESULT_NORETURN(ML_ERROR_NONE, nRet, "ml_tensors_info_destroy", NnStreamerGetError(nRet)); + nRet = ml_tensors_info_destroy (hGetOutputTensorsInfoHandle); + PRINT_RESULT_NORETURN(ML_ERROR_NONE, nRet, "ml_tensors_info_destroy", NnStreamerGetError(nRet)); + return 0; } @@ -947,6 +950,7 @@ int ITc_nnstreamer_single_invoke_with_extended_p (void) START_TEST; int nRet = -1; + ml_single_h hSingleHandle = NULL; ml_tensors_info_h hInputInfo = NULL; ml_tensors_info_h hOutputInfo = NULL; ml_tensors_data_h hInputData = NULL; @@ -1001,19 +1005,19 @@ int ITc_nnstreamer_single_invoke_with_extended_p (void) nRet = ml_tensors_info_set_tensor_dimension (hOutputInfo, 0, hOutputDim); PRINT_RESULT_CLEANUP(ML_ERROR_NONE, nRet, "ml_tensors_info_set_tensor_dimension", NnStreamerGetError(nRet), ml_tensors_info_destroy(hInputInfo); ml_tensors_info_destroy(hOutputInfo)); - nRet = ml_single_open(&g_SingleHandle, TestModel, hInputInfo, hOutputInfo, ML_NNFW_TYPE_TENSORFLOW_LITE, ML_NNFW_HW_ANY); + nRet = ml_single_open(&hSingleHandle, TestModel, hInputInfo, hOutputInfo, ML_NNFW_TYPE_TENSORFLOW_LITE, ML_NNFW_HW_ANY); PRINT_RESULT_CLEANUP(ML_ERROR_NONE, nRet, "ml_single_open", NnStreamerGetError(nRet), ml_tensors_info_destroy(hInputInfo); ml_tensors_info_destroy(hOutputInfo)); - CHECK_HANDLE_CLEANUP(g_SingleHandle, "ml_single_open", ml_tensors_info_destroy(hInputInfo); ml_tensors_info_destroy(hOutputInfo)); + CHECK_HANDLE_CLEANUP(hSingleHandle, "ml_single_open", ml_tensors_info_destroy(hInputInfo); ml_tensors_info_destroy(hOutputInfo)); FREE_MEMORY(model_file_path); nRet = ml_tensors_data_create(hInputInfo, &hInputData); - PRINT_RESULT_CLEANUP(ML_ERROR_NONE, nRet, "ml_tensors_data_create", NnStreamerGetError(nRet), ml_single_close(g_SingleHandle); ml_tensors_info_destroy(hInputInfo); ml_tensors_info_destroy(hOutputInfo)); - CHECK_HANDLE_CLEANUP(hInputData, "ml_tensors_data_create", ml_single_close(g_SingleHandle); ml_tensors_info_destroy(hInputInfo); ml_tensors_info_destroy(hOutputInfo)); + PRINT_RESULT_CLEANUP(ML_ERROR_NONE, nRet, "ml_tensors_data_create", NnStreamerGetError(nRet), ml_single_close(hSingleHandle); ml_tensors_info_destroy(hInputInfo); ml_tensors_info_destroy(hOutputInfo)); + CHECK_HANDLE_CLEANUP(hInputData, "ml_tensors_data_create", ml_single_close(hSingleHandle); ml_tensors_info_destroy(hInputInfo); ml_tensors_info_destroy(hOutputInfo)); - nRet = ml_single_invoke(g_SingleHandle, hInputData, &hOutputData); - PRINT_RESULT_CLEANUP(ML_ERROR_NONE, nRet, "ml_single_invoke", NnStreamerGetError(nRet), ml_tensors_data_destroy(hInputData); ml_single_close(g_SingleHandle); ml_tensors_info_destroy(hInputInfo); ml_tensors_info_destroy(hOutputInfo)); - CHECK_HANDLE_CLEANUP(hOutputData, "ml_single_invoke", ml_tensors_data_destroy(hInputData); ml_single_close(g_SingleHandle); ml_tensors_info_destroy(hInputInfo); ml_tensors_info_destroy(hOutputInfo)); + nRet = ml_single_invoke(hSingleHandle, hInputData, &hOutputData); + PRINT_RESULT_CLEANUP(ML_ERROR_NONE, nRet, "ml_single_invoke", NnStreamerGetError(nRet), ml_tensors_data_destroy(hInputData); ml_single_close(hSingleHandle); ml_tensors_info_destroy(hInputInfo); ml_tensors_info_destroy(hOutputInfo)); + CHECK_HANDLE_CLEANUP(hOutputData, "ml_single_invoke", ml_tensors_data_destroy(hInputData); ml_single_close(hSingleHandle); ml_tensors_info_destroy(hInputInfo); ml_tensors_info_destroy(hOutputInfo)); nRet = ml_tensors_data_destroy(hOutputData); PRINT_RESULT_NORETURN(ML_ERROR_NONE, nRet, "ml_tensors_data_destroy", NnStreamerGetError(nRet)); @@ -1021,7 +1025,7 @@ int ITc_nnstreamer_single_invoke_with_extended_p (void) nRet = ml_tensors_data_destroy(hInputData); PRINT_RESULT_NORETURN(ML_ERROR_NONE, nRet, "ml_tensors_data_destroy", NnStreamerGetError(nRet)); - nRet = ml_single_close(g_SingleHandle); + nRet = ml_single_close(hSingleHandle); PRINT_RESULT_NORETURN(ML_ERROR_NONE, nRet, "ml_single_close", NnStreamerGetError(nRet)); nRet = ml_tensors_info_destroy(hInputInfo); @@ -1150,4 +1154,4 @@ int ITc_nnstreamer_single_ml_invoke_with_many_inout_p(void) } /** @} */ -/** @} */ \ No newline at end of file +/** @} */