From 3afc2a7be0c0c7b8d6397643222ec36ed67fd6cb Mon Sep 17 00:00:00 2001 From: SooChan Lim Date: Wed, 23 Jun 2021 18:02:31 +0900 Subject: [PATCH] tbm_module: fix MEAMORY_LEAK.EX fix the memory leak Change-Id: Ib357b8e3807e605eec812cf3ce78418086390ba4 --- include/tbm_log.h | 8 +++ src/tbm_module.c | 158 +++++++++++++++++++++++++----------------------------- 2 files changed, 80 insertions(+), 86 deletions(-) diff --git a/include/tbm_log.h b/include/tbm_log.h index d37c351..d133933 100644 --- a/include/tbm_log.h +++ b/include/tbm_log.h @@ -149,6 +149,14 @@ void tbm_log_print_stdout(int level, const char *fmt, ...); } \ } +#define TBM_GOTO_VAL_SET_ERR_IF_FAIL(cond, val, error, error_type) {\ + if (!(cond)) {\ + TBM_ERR("'%s' failed.\n", #cond);\ + error = error_type;\ + goto val;\ + } \ +} + #ifdef __cplusplus } #endif diff --git a/src/tbm_module.c b/src/tbm_module.c index 2ebe220..652713d 100644 --- a/src/tbm_module.c +++ b/src/tbm_module.c @@ -757,46 +757,38 @@ tbm_module_alloc_bo_data(tbm_module *module, tbm_bo bo, int size, int flags, tbm TBM_RETURN_VAL_SET_ERR_IF_FAIL(module, NULL, *error, TBM_ERROR_INVALID_PARAMETER); bo_data = calloc(1, sizeof(struct _tbm_bo_data)); - if (!bo_data) { - TBM_ERR("memory allocation failed."); - *error = TBM_ERROR_OUT_OF_MEMORY; - return NULL; - } + TBM_GOTO_VAL_SET_ERR_IF_FAIL(bo_data, failed, *error, TBM_ERROR_OUT_OF_MEMORY); switch (module->type) { case TBM_MODULE_TYPE_HAL_TBM: bo_data->hal_bo = hal_tbm_bufmgr_alloc_bo(module->hal_bufmgr, size, flags, (hal_tbm_error *)error); - if (!bo_data->hal_bo) { - free(bo_data); - TBM_RETURN_VAL_IF_FAIL(bo_data->hal_bo, NULL); - } + TBM_GOTO_VAL_IF_FAIL(bo_data->hal_bo, failed); break; /* LCOV_EXCL_START */ case TBM_MODULE_TYPE_TBM_BACKEND: bufmgr_func = module->bufmgr_func; - TBM_RETURN_VAL_SET_ERR_IF_FAIL(bufmgr_func, NULL, *error, TBM_ERROR_INVALID_OPERATION); - TBM_RETURN_VAL_SET_ERR_IF_FAIL(bufmgr_func->bufmgr_alloc_bo, NULL, *error, TBM_ERROR_NOT_SUPPORTED); + TBM_GOTO_VAL_SET_ERR_IF_FAIL(bufmgr_func, failed, *error, TBM_ERROR_INVALID_OPERATION); + TBM_GOTO_VAL_SET_ERR_IF_FAIL(bufmgr_func->bufmgr_alloc_bo, failed, *error, TBM_ERROR_NOT_SUPPORTED); bo_data->backend_bo_data = bufmgr_func->bufmgr_alloc_bo(module->bufmgr_data, (unsigned int)size, flags, error); - if (!bo_data->backend_bo_data) { - free(bo_data); - TBM_RETURN_VAL_IF_FAIL(bo_data->backend_bo_data, NULL); - } + TBM_GOTO_VAL_IF_FAIL(bo_data->backend_bo_data, failed); break; case TBM_MODULE_TYPE_BUFMGR_BACKEND: TBM_WRN("!!WARNING: This backend interface will be DEPRECATED after Tizen 6.5."); + backend = module->backend; - TBM_RETURN_VAL_SET_ERR_IF_FAIL(backend, NULL, *error, TBM_ERROR_INVALID_OPERATION); - TBM_RETURN_VAL_SET_ERR_IF_FAIL(backend->bo_alloc, NULL, *error, TBM_ERROR_NOT_SUPPORTED); + TBM_GOTO_VAL_SET_ERR_IF_FAIL(backend, failed, *error, TBM_ERROR_INVALID_OPERATION); + TBM_GOTO_VAL_SET_ERR_IF_FAIL(backend->bo_alloc, failed, *error, TBM_ERROR_NOT_SUPPORTED); bo_data->priv = (void *)backend->bo_alloc(bo, size, flags); + TBM_GOTO_VAL_SET_ERR_IF_FAIL(bo_data->priv, failed, *error, TBM_ERROR_INVALID_OPERATION); + *error = TBM_ERROR_NONE; - free(bo_data); break; default: TBM_ERR("Wrong module type:%d", module->type); *error = TBM_ERROR_INVALID_OPERATION; - free(bo_data); + goto failed; break; /* LCOV_EXCL_STOP */ } @@ -804,6 +796,14 @@ tbm_module_alloc_bo_data(tbm_module *module, tbm_bo bo, int size, int flags, tbm bo_data->module = module; return bo_data; + +/* LCOV_EXCL_START */ +failed: + if (bo_data) + free(bo_data); + + return NULL; +/* LCOV_EXCL_STOP */ } tbm_bo_data * @@ -816,48 +816,38 @@ tbm_module_alloc_bo_data_with_format(tbm_module *module, int format, int bo_idx, TBM_RETURN_VAL_SET_ERR_IF_FAIL(module, NULL, *error, TBM_ERROR_INVALID_PARAMETER); bo_data = calloc(1, sizeof(struct _tbm_bo_data)); - if (!bo_data) { - TBM_ERR("memory allocation failed."); - *error = TBM_ERROR_OUT_OF_MEMORY; - return NULL; - } + TBM_GOTO_VAL_SET_ERR_IF_FAIL(bo_data, failed, *error, TBM_ERROR_OUT_OF_MEMORY); switch (module->type) { case TBM_MODULE_TYPE_HAL_TBM: bo_data->hal_bo = hal_tbm_bufmgr_alloc_bo_with_format(module->hal_bufmgr, format, bo_idx, width, height, bpp, (hal_tbm_bo_memory_type)flags, (hal_tbm_error *)error); - if (!bo_data->hal_bo) { - free(bo_data); - TBM_RETURN_VAL_IF_FAIL(bo_data->hal_bo, NULL); - } + TBM_GOTO_VAL_IF_FAIL(bo_data->hal_bo, failed); break; /* LCOV_EXCL_START */ case TBM_MODULE_TYPE_TBM_BACKEND: bufmgr_func = module->bufmgr_func; - TBM_RETURN_VAL_SET_ERR_IF_FAIL(bufmgr_func, NULL, *error, TBM_ERROR_INVALID_OPERATION); + TBM_GOTO_VAL_SET_ERR_IF_FAIL(bufmgr_func, failed, *error, TBM_ERROR_INVALID_OPERATION); if (!bufmgr_func->bufmgr_alloc_bo_with_format) { *error = TBM_ERROR_NOT_SUPPORTED; - return NULL; + goto failed; } bo_data->backend_bo_data = bufmgr_func->bufmgr_alloc_bo_with_format(module->bufmgr_data, format, bo_idx, width, height, flags, error); - if (!bo_data->backend_bo_data) { - free(bo_data); - TBM_RETURN_VAL_IF_FAIL(bo_data->backend_bo_data, NULL); - } + TBM_GOTO_VAL_IF_FAIL(bo_data->backend_bo_data, failed); break; case TBM_MODULE_TYPE_BUFMGR_BACKEND: TBM_WRN("!!WARNING: This backend interface will be DEPRECATED after Tizen 6.5."); TBM_ERR("error: not supported tbm_bufmgr_internal_alloc_bo_with_format."); *error = TBM_ERROR_NOT_SUPPORTED; - free(bo_data); + goto failed; break; default: TBM_ERR("Wrong module type:%d", module->type); *error = TBM_ERROR_INVALID_OPERATION; - free(bo_data); + goto failed; break; /* LCOV_EXCL_STOP */ } @@ -865,6 +855,14 @@ tbm_module_alloc_bo_data_with_format(tbm_module *module, int format, int bo_idx, bo_data->module = module; return bo_data; + +/* LCOV_EXCL_START */ +failed: + if (bo_data) + free(bo_data); + + return NULL; +/* LCOV_EXCL_STOP */ } tbm_bo_data * @@ -877,51 +875,37 @@ tbm_module_import_bo_data_with_fd(tbm_module *module, tbm_bo bo, tbm_fd fd, tbm_ TBM_RETURN_VAL_SET_ERR_IF_FAIL(module, NULL, *error, TBM_ERROR_INVALID_PARAMETER); bo_data = calloc(1, sizeof(struct _tbm_bo_data)); - if (!bo_data) { - TBM_ERR("memory allocation failed."); - *error = TBM_ERROR_OUT_OF_MEMORY; - return NULL; - } + TBM_GOTO_VAL_SET_ERR_IF_FAIL(bo_data, failed, *error, TBM_ERROR_OUT_OF_MEMORY); switch (module->type) { case TBM_MODULE_TYPE_HAL_TBM: bo_data->hal_bo = hal_tbm_bufmgr_import_fd(module->hal_bufmgr, (hal_tbm_fd)fd, (hal_tbm_error *)error); - if (!bo_data->hal_bo) { - free(bo_data); - TBM_RETURN_VAL_IF_FAIL(bo_data->hal_bo, NULL); - } + TBM_GOTO_VAL_IF_FAIL(bo_data->hal_bo, failed); break; /* LCOV_EXCL_START */ case TBM_MODULE_TYPE_TBM_BACKEND: bufmgr_func = module->bufmgr_func; - TBM_RETURN_VAL_SET_ERR_IF_FAIL(bufmgr_func, NULL, *error, TBM_ERROR_INVALID_OPERATION); - TBM_RETURN_VAL_SET_ERR_IF_FAIL(bufmgr_func->bufmgr_import_fd, NULL, *error, TBM_ERROR_NOT_SUPPORTED); + TBM_GOTO_VAL_SET_ERR_IF_FAIL(bufmgr_func, failed, *error, TBM_ERROR_INVALID_OPERATION); + TBM_GOTO_VAL_SET_ERR_IF_FAIL(bufmgr_func->bufmgr_import_fd, failed, *error, TBM_ERROR_NOT_SUPPORTED); bo_data->backend_bo_data = bufmgr_func->bufmgr_import_fd(module->bufmgr_data, fd, error); - if (!bo_data->backend_bo_data) { - free(bo_data); - TBM_RETURN_VAL_IF_FAIL(bo_data->backend_bo_data, NULL); - } + TBM_GOTO_VAL_IF_FAIL(bo_data->backend_bo_data, failed); break; case TBM_MODULE_TYPE_BUFMGR_BACKEND: TBM_WRN("!!WARNING: This backend interface will be DEPRECATED after Tizen 6.5."); backend = module->backend; - TBM_RETURN_VAL_SET_ERR_IF_FAIL(backend, NULL, *error, TBM_ERROR_INVALID_OPERATION); - TBM_RETURN_VAL_SET_ERR_IF_FAIL(backend->bo_import_fd, NULL, *error, TBM_ERROR_NOT_SUPPORTED); + TBM_GOTO_VAL_SET_ERR_IF_FAIL(backend, failed, *error, TBM_ERROR_INVALID_OPERATION); + TBM_GOTO_VAL_SET_ERR_IF_FAIL(backend->bo_import_fd, failed, *error, TBM_ERROR_NOT_SUPPORTED); bo_data->priv = (void *)backend->bo_import_fd(bo, fd); - if (!bo_data->priv) { - *error = TBM_ERROR_INVALID_OPERATION; - free(bo_data); - TBM_RETURN_VAL_IF_FAIL(bo_data->priv, NULL); - } else { - *error = TBM_ERROR_NONE; - } + TBM_GOTO_VAL_SET_ERR_IF_FAIL(bo_data->priv, failed, *error, TBM_ERROR_INVALID_OPERATION); + + *error = TBM_ERROR_NONE; break; default: TBM_ERR("Wrong module type:%d", module->type); *error = TBM_ERROR_INVALID_OPERATION; - free(bo_data); + goto failed; break; /* LCOV_EXCL_STOP */ } @@ -929,6 +913,14 @@ tbm_module_import_bo_data_with_fd(tbm_module *module, tbm_bo bo, tbm_fd fd, tbm_ bo_data->module = module; return bo_data; + +/* LCOV_EXCL_START */ +failed: + if (bo_data) + free(bo_data); + + return NULL; +/* LCOV_EXCL_STOP */ } tbm_bo_data * @@ -941,51 +933,37 @@ tbm_module_import_bo_data_with_key(tbm_module *module, tbm_bo bo, tbm_key key, t TBM_RETURN_VAL_SET_ERR_IF_FAIL(module, NULL, *error, TBM_ERROR_INVALID_PARAMETER); bo_data = calloc(1, sizeof(struct _tbm_bo_data)); - if (!bo_data) { - TBM_ERR("memory allocation failed."); - *error = TBM_ERROR_OUT_OF_MEMORY; - return NULL; - } + TBM_GOTO_VAL_SET_ERR_IF_FAIL(bo_data, failed, *error, TBM_ERROR_OUT_OF_MEMORY); switch (module->type) { case TBM_MODULE_TYPE_HAL_TBM: bo_data->hal_bo = hal_tbm_bufmgr_import_key(module->hal_bufmgr, key, (hal_tbm_error *)error); - if (!bo_data->hal_bo) { - free(bo_data); - TBM_RETURN_VAL_IF_FAIL(bo_data->hal_bo, NULL); - } + TBM_GOTO_VAL_IF_FAIL(bo_data->hal_bo, failed); break; /* LCOV_EXCL_START */ case TBM_MODULE_TYPE_TBM_BACKEND: bufmgr_func = module->bufmgr_func; - TBM_RETURN_VAL_SET_ERR_IF_FAIL(bufmgr_func, NULL, *error, TBM_ERROR_INVALID_OPERATION); - TBM_RETURN_VAL_SET_ERR_IF_FAIL(bufmgr_func->bufmgr_import_key, NULL, *error, TBM_ERROR_NOT_SUPPORTED); + TBM_GOTO_VAL_SET_ERR_IF_FAIL(bufmgr_func, failed, *error, TBM_ERROR_INVALID_OPERATION); + TBM_GOTO_VAL_SET_ERR_IF_FAIL(bufmgr_func->bufmgr_import_key, failed, *error, TBM_ERROR_NOT_SUPPORTED); bo_data->backend_bo_data = bufmgr_func->bufmgr_import_key(module->bufmgr_data, key, error); - if (!bo_data->backend_bo_data) { - free(bo_data); - TBM_RETURN_VAL_IF_FAIL(bo_data->backend_bo_data, NULL); - } + TBM_GOTO_VAL_IF_FAIL(bo_data->backend_bo_data, failed); break; case TBM_MODULE_TYPE_BUFMGR_BACKEND: TBM_WRN("!!WARNING: This backend interface will be DEPRECATED after Tizen 6.5."); backend = module->backend; - TBM_RETURN_VAL_SET_ERR_IF_FAIL(backend, NULL, *error, TBM_ERROR_INVALID_OPERATION); - TBM_RETURN_VAL_SET_ERR_IF_FAIL(backend->bo_import, NULL, *error, TBM_ERROR_NOT_SUPPORTED); + TBM_GOTO_VAL_SET_ERR_IF_FAIL(backend, failed, *error, TBM_ERROR_INVALID_OPERATION); + TBM_GOTO_VAL_SET_ERR_IF_FAIL(backend->bo_import, failed, *error, TBM_ERROR_NOT_SUPPORTED); bo_data->priv = (void *)backend->bo_import(bo, key); - if (!bo_data->priv) { - *error = TBM_ERROR_INVALID_OPERATION; - free(bo_data); - TBM_RETURN_VAL_IF_FAIL(bo_data->priv, NULL); - } else { - *error = TBM_ERROR_NONE; - } + TBM_GOTO_VAL_SET_ERR_IF_FAIL(bo_data->priv, failed, *error, TBM_ERROR_INVALID_OPERATION); + + *error = TBM_ERROR_NONE; break; default: TBM_ERR("Wrong module type:%d", module->type); *error = TBM_ERROR_INVALID_OPERATION; - free(bo_data); + goto failed; break; /* LCOV_EXCL_STOP */ } @@ -993,6 +971,14 @@ tbm_module_import_bo_data_with_key(tbm_module *module, tbm_bo bo, tbm_key key, t bo_data->module = module; return bo_data; + +/* LCOV_EXCL_START */ +failed: + if (bo_data) + free(bo_data); + + return NULL; +/* LCOV_EXCL_STOP */ } int -- 2.7.4