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