From e36aee0b7f53fbebc854da672828be6f517fb1eb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20Leroy?= <frederic.leroy@b-com.com> Date: Fri, 22 Jul 2016 16:30:58 +0200 Subject: [PATCH] UE: factorize calloc() calls and exit on failure --- cmake_targets/CMakeLists.txt | 2 + cmake_targets/at_commands/CMakeLists.txt | 5 +- common/utils/Makefile.inc | 59 ------------------------ common/utils/utils.c | 23 +++++++++ common/utils/utils.h | 9 ++++ openair3/NAS/UE/EMM/IdleMode.c | 7 +-- openair3/NAS/UE/EMM/emm_main.c | 25 ++-------- openair3/NAS/UE/ESM/esm_ebr.c | 8 +--- openair3/NAS/UE/ESM/esm_main.c | 7 +-- openair3/NAS/UE/ESM/esm_pt.c | 8 +--- openair3/NAS/UE/nas_proc.c | 14 ++---- openair3/NAS/UE/nas_ue_task.c | 29 ++---------- openair3/NAS/UE/nas_user.c | 13 ++---- 13 files changed, 62 insertions(+), 147 deletions(-) delete mode 100644 common/utils/Makefile.inc create mode 100644 common/utils/utils.c create mode 100644 common/utils/utils.h diff --git a/cmake_targets/CMakeLists.txt b/cmake_targets/CMakeLists.txt index 94ff4b239a4..9d94e75d6c4 100644 --- a/cmake_targets/CMakeLists.txt +++ b/cmake_targets/CMakeLists.txt @@ -1757,6 +1757,7 @@ add_executable(lte-softmodem ${OPENAIR_TARGETS}/ARCH/COMMON/common_lib.c ${OPENAIR1_DIR}/SIMULATION/ETH_TRANSPORT/netlink_init.c ${OPENAIR3_DIR}/NAS/UE/nas_ue_task.c + ${OPENAIR_DIR}/common/utils/utils.c ${GTPU_need_ITTI} ${HW_SOURCE} ${TRANSPORT_SOURCE} @@ -1886,6 +1887,7 @@ add_executable(oaisim ${OPENAIR2_DIR}/RRC/NAS/nas_config.c ${OPENAIR2_DIR}/RRC/NAS/rb_config.c ${OPENAIR3_DIR}/NAS/UE/nas_ue_task.c + ${OPENAIR_DIR}/common/utils/utils.c ${GTPU_need_ITTI} ${OPENAIR_TARGETS}/COMMON/create_tasks.c ${HW_SOURCE} diff --git a/cmake_targets/at_commands/CMakeLists.txt b/cmake_targets/at_commands/CMakeLists.txt index a4596490814..bf964cec465 100755 --- a/cmake_targets/at_commands/CMakeLists.txt +++ b/cmake_targets/at_commands/CMakeLists.txt @@ -410,7 +410,6 @@ target_include_directories(emm PRIVATE # esm LIB ################################################################################ set(esm_SRC - ${OPENAIR_NAS_DIR}/UE/ESM/esm_main.c ${OPENAIR_NAS_DIR}/UE/ESM/DedicatedEpsBearerContextActivation.c ${OPENAIR_NAS_DIR}/UE/ESM/DefaultEpsBearerContextActivation.c ${OPENAIR_NAS_DIR}/UE/ESM/EpsBearerContextDeactivation.c @@ -482,11 +481,13 @@ set(esm_HDR ${OPENAIR_NAS_DIR}/UE/ESM/SAP/esm_recv.h ${OPENAIR_NAS_DIR}/UE/ESM/SAP/esm_sap.h ${OPENAIR_NAS_DIR}/UE/ESM/SAP/esm_send.h + ${OPENAIR_DIR}/common/utils/utils.h ) add_library(esm ${esm_SRC} ${esm_HDR}) target_include_directories(esm PRIVATE + ${OPENAIR_DIR}/common/utils ${OPENAIR_NAS_DIR}/UE ${OPENAIR_NAS_DIR}/UE/API/USER ${OPENAIR_NAS_DIR}/UE/ESM @@ -673,6 +674,7 @@ target_include_directories(ies PRIVATE ################################################################################ include_directories( ${OPENAIR_NAS_DIR}/UE + ${OPENAIR_DIR}/common/utils ${OPENAIR_DIR}/common/utils/msc ${OPENAIR3_DIR}/COMMON ${OPENAIR3_DIR}/SECU @@ -694,6 +696,7 @@ ADD_EXECUTABLE(at_nas_ue ${OPENAIR_NAS_DIR}/UE/UEprocess.c ${OPENAIR_NAS_DIR}/UE/nas_parser.c ${OPENAIR_NAS_DIR}/UE/nas_proc.c ${OPENAIR_NAS_DIR}/UE/nas_user.c + ${OPENAIR_DIR}/common/utils/utils.c ) target_link_libraries (at_nas_ue diff --git a/common/utils/Makefile.inc b/common/utils/Makefile.inc deleted file mode 100644 index 33c126b8d73..00000000000 --- a/common/utils/Makefile.inc +++ /dev/null @@ -1,59 +0,0 @@ -export KERNEL_DIR=/lib/modules/$(shell uname -r)/ -CC=gcc -CCC=gcc -linux := $(shell if [ `uname` = "Linux" ] ; then echo "1" ; else echo "0" ; fi) - - -CFLAGS += -std=gnu99 -CFLAGS += -Wall -g -ggdb -Wstrict-prototypes -fno-strict-aliasing - -# Need to force this option because default kernel module builder is wrong -CFLAGS += $(call cc-option,-mpreferred-stack-boundary=4) - -#For performance, if some option doesn't exist in all gcc versions, use $(call cc-option,MY_OPTION) -#CFLAGS += -O2 -#CFLAGS += -funroll-loops -CFLAGS += -Wno-packed-bitfield-compat - -# This is the minimum CPU faetures for OAI -CFLAGS += -mmmx -msse -msse2 -mssse3 -msse4.1 -# Add CPU features from local CPU -#CFLAGS += -march=native - -ifeq ($(OSTYPE),Cygwin) -cygwin=1 -CFLAGS += -DCYGWIN -else -cygwin=0 -endif - -ifeq ($(linux),1) -CFLAGS += -LDFLAGS += -endif - -ITTI_DIR = $(COMMON_UTILS_DIR)/itti - -ITTI_OBJS = $(ITTI_DIR)/intertask_interface.o -ITTI_OBJS += $(ITTI_DIR)/intertask_interface_dump.o -ITTI_OBJS += $(ITTI_DIR)/backtrace.o -ITTI_OBJS += $(ITTI_DIR)/memory_pools.o -ITTI_OBJS += $(ITTI_DIR)/signals.o -ITTI_OBJS += $(ITTI_DIR)/timer.o - - -HASHTABLE_DIR = $(COMMON_UTILS_DIR)/collection/hashtable -MSC_DIR = $(COMMON_UTILS_DIR)/msc - -HASHTABLE_OBJS = $(HASHTABLE_DIR)/hashtable.o -HASHTABLE_OBJS += $(HASHTABLE_DIR)/obj_hashtable.o - -UTILS_OBJS = $(ITTI_OBJS) $(HASHTABLE_OBJS) - -UTILS_incl = \ - -I$(COMMON_UTILS_DIR) \ - -I$(HASHTABLE_DIR) \ - -I$(ITTI_DIR) \ - -I$(MSC_DIR) - -print-% : ; @echo $* = $($*) diff --git a/common/utils/utils.c b/common/utils/utils.c new file mode 100644 index 00000000000..7d292cc84d0 --- /dev/null +++ b/common/utils/utils.c @@ -0,0 +1,23 @@ +#include <string.h> +#include <stdio.h> +#include <stdlib.h> +#include <stdint.h> +#include "utils.h" + +void *calloc_or_fail(size_t size) { + void *ptr = calloc(1, size); + if (ptr == NULL) { + fprintf(stderr, "[UE] Failed to calloc %zu bytes", size); + exit(EXIT_FAILURE); + } + return ptr; +} + +void *malloc_or_fail(size_t size) { + void *ptr = malloc(size); + if (ptr == NULL) { + fprintf(stderr, "[UE] Failed to malloc %zu bytes", size); + exit(EXIT_FAILURE); + } + return ptr; +} diff --git a/common/utils/utils.h b/common/utils/utils.h new file mode 100644 index 00000000000..db455485a2a --- /dev/null +++ b/common/utils/utils.h @@ -0,0 +1,9 @@ +#ifndef _UTILS_H +#define _UTILS_H + +#include <sys/types.h> + +void *calloc_or_fail(size_t size); +void *malloc_or_fail(size_t size); + +#endif diff --git a/openair3/NAS/UE/EMM/IdleMode.c b/openair3/NAS/UE/EMM/IdleMode.c index e087fe26cd2..159a3b2a2ce 100644 --- a/openair3/NAS/UE/EMM/IdleMode.c +++ b/openair3/NAS/UE/EMM/IdleMode.c @@ -59,6 +59,7 @@ Description Defines EMM procedures executed by the Non-Access Stratum #include "emm_proc.h" #include "nas_log.h" +#include "utils.h" #include "emm_sap.h" @@ -106,11 +107,7 @@ static IdleMode_callback_t _emm_indication_notify; ***************************************************************************/ void IdleMode_initialize(nas_user_t *user, IdleMode_callback_t cb) { - emm_plmn_list_t *emm_plmn_list = calloc(1, sizeof(emm_plmn_list_t)); - if ( emm_plmn_list == NULL ) { - LOG_TRACE(ERROR, "EMM - Can't alloc emm_plmn_list"); - exit(EXIT_FAILURE); - } + emm_plmn_list_t *emm_plmn_list = calloc_or_fail( sizeof(emm_plmn_list_t)); user->emm_plmn_list = emm_plmn_list; /* Initialize the list of available PLMNs */ emm_plmn_list->n_plmns = 0; diff --git a/openair3/NAS/UE/EMM/emm_main.c b/openair3/NAS/UE/EMM/emm_main.c index 3b2b87c6f02..2de879506ac 100644 --- a/openair3/NAS/UE/EMM/emm_main.c +++ b/openair3/NAS/UE/EMM/emm_main.c @@ -39,6 +39,7 @@ Description Defines the EPS Mobility Management procedure call manager, #include "emm_main.h" #include "nas_log.h" +#include "utils.h" #include "emmData.h" #include "MobileIdentity.h" #include "emm_proc_defs.h" @@ -134,11 +135,7 @@ void _emm_detach_initialize(emm_detach_data_t *emm_detach) { void emm_main_initialize(nas_user_t *user, emm_indication_callback_t cb, const char *imei) { LOG_FUNC_IN; - user->emm_data = calloc(1, sizeof(emm_data_t)); - if ( user->emm_data == NULL ) { - LOG_TRACE(ERROR, "EMM-MAIN - Failed to get allocate emm_data"); - exit(EXIT_FAILURE); - } + user->emm_data = calloc_or_fail(sizeof(emm_data_t)); /* USIM validity indicator */ user->emm_data->usim_is_valid = FALSE; /* The IMEI read from the UE's non-volatile memory */ @@ -397,31 +394,19 @@ void emm_main_initialize(nas_user_t *user, emm_indication_callback_t cb, const c /* * Initialize EMM timers */ - user->emm_data->emm_timers = calloc(1, sizeof(emm_timers_t)); - if ( user->emm_data->emm_timers == NULL ) { - LOG_TRACE(ERROR, "EMM-MAIN - Failed to alloc emm_timers"); - exit(EXIT_FAILURE); - } + user->emm_data->emm_timers = calloc_or_fail(sizeof(emm_timers_t)); _emm_timers_initialize(user->emm_data->emm_timers); /* * Initialize Internal data used for detach procedure */ - user->emm_data->emm_detach_data = calloc(1, sizeof(emm_detach_data_t)); - if ( user->emm_data->emm_detach_data == NULL ) { - LOG_TRACE(ERROR, "EMM-MAIN - Failed to alloc emm_timers"); - exit(EXIT_FAILURE); - } + user->emm_data->emm_detach_data = calloc_or_fail(sizeof(emm_detach_data_t)); _emm_detach_initialize(user->emm_data->emm_detach_data); /* * Initialize Internal data used for attach procedure */ - user->emm_data->emm_attach_data = calloc(1, sizeof(emm_attach_data_t)); - if ( user->emm_data->emm_attach_data == NULL ) { - LOG_TRACE(ERROR, "EMM-MAIN - Failed to alloc emm_timers"); - exit(EXIT_FAILURE); - } + user->emm_data->emm_attach_data = calloc_or_fail(sizeof(emm_attach_data_t)); _emm_attach_initialize(user->emm_data->emm_attach_data); /* diff --git a/openair3/NAS/UE/ESM/esm_ebr.c b/openair3/NAS/UE/ESM/esm_ebr.c index 7c04043233a..330da2fb236 100644 --- a/openair3/NAS/UE/ESM/esm_ebr.c +++ b/openair3/NAS/UE/ESM/esm_ebr.c @@ -44,6 +44,7 @@ Description Defines functions used to handle state of EPS bearer contexts #include "esm_ebr.h" #include "commonDef.h" #include "nas_log.h" +#include "utils.h" /****************************************************************************/ @@ -115,12 +116,7 @@ esm_ebr_data_t *esm_ebr_initialize(void) LOG_FUNC_IN; int i; - esm_ebr_data_t *esm_ebr_data = calloc(1, sizeof(esm_ebr_data_t)); - - if ( esm_ebr_data == NULL ) { - LOG_TRACE(ERROR, "ESM-EBR - Can't malloc esm_ebr_data"); - exit(EXIT_FAILURE); - } + esm_ebr_data_t *esm_ebr_data = calloc_or_fail(sizeof(esm_ebr_data_t)); esm_ebr_data->index = 0; diff --git a/openair3/NAS/UE/ESM/esm_main.c b/openair3/NAS/UE/ESM/esm_main.c index 96d387a0e32..6c110abb52e 100644 --- a/openair3/NAS/UE/ESM/esm_main.c +++ b/openair3/NAS/UE/ESM/esm_main.c @@ -40,6 +40,7 @@ Description Defines the EPS Session Management procedure call manager, #include "esm_main.h" #include "commonDef.h" #include "nas_log.h" +#include "utils.h" #include "emmData.h" #include "esmData.h" @@ -78,11 +79,7 @@ void esm_main_initialize(nas_user_t *user, esm_indication_callback_t cb) int i; - esm_data_t *esm_data = calloc(1, sizeof(esm_data_t)); - if ( esm_data == NULL ) { - LOG_TRACE(ERROR, "ESM-MAIN - Can't malloc esm_data"); - exit(EXIT_FAILURE); - } + esm_data_t *esm_data = calloc_or_fail(sizeof(esm_data_t)); user->esm_data = esm_data; default_eps_bearer_context_data_t *default_eps_bearer_context = calloc(1, sizeof(default_eps_bearer_context_data_t)); diff --git a/openair3/NAS/UE/ESM/esm_pt.c b/openair3/NAS/UE/ESM/esm_pt.c index 12cebc9aa1d..9f8e948954b 100644 --- a/openair3/NAS/UE/ESM/esm_pt.c +++ b/openair3/NAS/UE/ESM/esm_pt.c @@ -42,6 +42,7 @@ Description Defines functions used to handle ESM procedure transactions. #include "commonDef.h" #include "nas_log.h" +#include "utils.h" #include <stdlib.h> // malloc, free #include <string.h> // memcpy @@ -84,14 +85,9 @@ static int _esm_pt_get_available_entry(esm_pt_data_t *esm_pt_data); esm_pt_data_t *esm_pt_initialize(void) { LOG_FUNC_IN; - esm_pt_data_t *esm_pt_data = calloc(1, sizeof(esm_pt_data_t)); + esm_pt_data_t *esm_pt_data = calloc_or_fail(sizeof(esm_pt_data_t)); int i; - if ( esm_pt_data == NULL ) { - LOG_TRACE(ERROR, "ESM-PT - Can't alloc esm_pt_data"); - exit(EXIT_FAILURE); - } - esm_pt_data->index = 0; for (i = 0; i < ESM_PT_DATA_SIZE + 1; i++) { diff --git a/openair3/NAS/UE/nas_proc.c b/openair3/NAS/UE/nas_proc.c index bea7770b0db..b5ecc6a6ed9 100644 --- a/openair3/NAS/UE/nas_proc.c +++ b/openair3/NAS/UE/nas_proc.c @@ -39,6 +39,7 @@ Description NAS procedure call manager #include "nas_proc.h" #include "nas_log.h" #include "nas_user.h" +#include "utils.h" #include "emm_main.h" #include "emm_sap.h" @@ -97,17 +98,8 @@ void nas_proc_initialize(nas_user_t *user, emm_indication_callback_t emm_cb, user->proc.rsrq = NAS_PROC_RSRQ_UNKNOWN; user->proc.rsrp = NAS_PROC_RSRP_UNKNOWN; - user->authentication_data = calloc(1, sizeof(authentication_data_t)); - if ( user->authentication_data == NULL ) { - LOG_TRACE(ERROR, "NAS-PROC - Failed to alloc authentication_data"); - exit(EXIT_FAILURE); - } - - user->security_data = calloc(1, sizeof(security_data_t)); - if ( user->security_data == NULL ) { - LOG_TRACE(ERROR, "NAS-PROC - Failed to alloc security_data"); - exit(EXIT_FAILURE); - } + user->authentication_data = calloc_or_fail(sizeof(authentication_data_t)); + user->security_data = calloc_or_fail( sizeof(security_data_t)); /* Initialize the EMM procedure manager */ emm_main_initialize(user, emm_cb, imei); diff --git a/openair3/NAS/UE/nas_ue_task.c b/openair3/NAS/UE/nas_ue_task.c index 05bd17fa636..eeef8c0e588 100644 --- a/openair3/NAS/UE/nas_ue_task.c +++ b/openair3/NAS/UE/nas_ue_task.c @@ -19,6 +19,7 @@ * contact@openairinterface.org */ +#include "utils.h" #if defined(ENABLE_ITTI) # include "assertions.h" # include "intertask_interface.h" @@ -81,13 +82,7 @@ void *nas_ue_task(void *args_p) { /* Initialize user interface (to exchange AT commands with user process) */ { - user_api_id_t *user_api_id = calloc(1, sizeof(user_api_id_t)); - - if (user_api_id == NULL) { - LOG_E(NAS, "[UE] Failed to alloc user_api_id_t"); - exit(EXIT_FAILURE); - } - + user_api_id_t *user_api_id = calloc_or_fail(sizeof(user_api_id_t)); user->user_api_id = user_api_id; if (user_api_initialize (user_api_id, NAS_PARSER_DEFAULT_USER_HOSTNAME, NAS_PARSER_DEFAULT_USER_PORT_NUMBER, NULL, @@ -99,23 +94,9 @@ void *nas_ue_task(void *args_p) itti_subscribe_event_fd (TASK_NAS_UE, user_api_get_fd(user_api_id)); } - user->user_at_commands = calloc(1, sizeof(user_at_commands_t)); - if ( user->user_at_commands == NULL ) { - LOG_E(NAS, "[UE %d] Can't allocate memory for user_at_commands\n", 0); - exit(EXIT_FAILURE); - } - - user->at_response = calloc(1, sizeof(at_response_t)); - if ( user->at_response == NULL ) { - LOG_E(NAS, "[UE %d] Can't allocate memory for at_response\n", 0); - exit(EXIT_FAILURE); - } - - user->lowerlayer_data = calloc(1, sizeof(lowerlayer_data_t)); - if ( user->lowerlayer_data == NULL ) { - LOG_E(NAS, "[UE %d] Can't allocate memory for lowerlayer_data\n", 0); - exit(EXIT_FAILURE); - } + user->user_at_commands = calloc_or_fail(sizeof(user_at_commands_t)); + user->at_response = calloc_or_fail(sizeof(at_response_t)); + user->lowerlayer_data = calloc_or_fail(sizeof(lowerlayer_data_t)); /* Initialize NAS user */ nas_user_initialize (user, &user_api_emm_callback, &user_api_esm_callback, FIRMWARE_VERSION); diff --git a/openair3/NAS/UE/nas_user.c b/openair3/NAS/UE/nas_user.c index f7fb6a07591..3756570ea0a 100644 --- a/openair3/NAS/UE/nas_user.c +++ b/openair3/NAS/UE/nas_user.c @@ -47,6 +47,7 @@ Description NAS procedure functions triggered by the user #include "user_indication.h" #include "nas_proc.h" #include "nas_user.h" +#include "utils.h" #include "user_api.h" #include <string.h> // memset, strncpy, strncmp @@ -158,11 +159,7 @@ void nas_user_initialize(nas_user_t *user, emm_indication_callback_t emm_cb, { LOG_FUNC_IN; - user->nas_user_nvdata = calloc(1, sizeof(user_nvdata_t)); - if ( user->nas_user_nvdata == NULL ) { - LOG_TRACE(ERROR, "USR-MAIN - Failed to alloc nas_user_nvdata"); - exit(EXIT_FAILURE); - } + user->nas_user_nvdata = calloc_or_fail(sizeof(user_nvdata_t)); /* Get UE's data pathname */ char *path = memory_get_path(USER_NVRAM_DIRNAME, USER_NVRAM_FILENAME); @@ -179,11 +176,7 @@ void nas_user_initialize(nas_user_t *user, emm_indication_callback_t emm_cb, } free(path); - user->nas_user_context = calloc(1, sizeof(nas_user_context_t)); - if ( user->nas_user_context == NULL ) { - LOG_TRACE(ERROR, "USR-MAIN - Failed to alloc nas_user_context"); - exit(EXIT_FAILURE); - } + user->nas_user_context = calloc_or_fail(sizeof(nas_user_context_t)); _nas_user_context_initialize(user->nas_user_context, version); /* Initialize the internal NAS processing data */ -- GitLab