[ITC][Non-ACR][Machine Learning] fix double-free error 51/316151/1
authorJaeyun Jung <jy1210.jung@samsung.com>
Wed, 14 Aug 2024 06:24:07 +0000 (15:24 +0900)
committerJaeyun Jung <jy1210.jung@samsung.com>
Wed, 14 Aug 2024 06:24:07 +0000 (15:24 +0900)
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 <jy1210.jung@samsung.com>
src/itc/nnstreamer/ITs-nnstreamer-single.c

index aecb7f772c2cbf4ef49d90ddb0082797197b203f..0efbb2a4f3ace9b10a0a41d620720e4d2a59bd84 100755 (executable)
@@ -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
+/** @} */