From 9535e7a276c2fe45822b4fb1cf55cc67d6a2ede5 Mon Sep 17 00:00:00 2001
From: Cedric Roux <cedric.roux@eurecom.fr>
Date: Thu, 16 Feb 2017 15:35:07 +0100
Subject: [PATCH] bugfix: make some functions thread safe

Those functions modify a global char array (a string).

Let's pass a buffer to those functions, so that it's
thread safe. The caller has been modified, with hopefully
a buffer big enough (still bigger than what was there before,
so should not break more than it did).
---
 openair3/NAS/UE/ESM/PdnConnectivity.c |  7 ++++---
 openair3/NAS/UE/ESM/esmData.h         | 11 +++--------
 openair3/NAS/UE/ESM/esm_ip.c          | 22 +++++++++-------------
 3 files changed, 16 insertions(+), 24 deletions(-)

diff --git a/openair3/NAS/UE/ESM/PdnConnectivity.c b/openair3/NAS/UE/ESM/PdnConnectivity.c
index c51d08cdbc2..f0a245e83e4 100644
--- a/openair3/NAS/UE/ESM/PdnConnectivity.c
+++ b/openair3/NAS/UE/ESM/PdnConnectivity.c
@@ -357,6 +357,7 @@ int esm_proc_pdn_connectivity_accept(nas_user_t *user, int pti, esm_proc_pdn_typ
   int     rc;
   int     pid = RETURNerror;
   char    apn_first_char[4];
+  char    str[128];
 
   if (isprint(apn->value[0])) {
     apn_first_char[0] = '\0';
@@ -366,9 +367,9 @@ int esm_proc_pdn_connectivity_accept(nas_user_t *user, int pti, esm_proc_pdn_typ
 
   LOG_TRACE(INFO, "ESM-PROC  - PDN connectivity accepted by the network "
             "(pti=%d) APN = %s\"%s\", IP address = %s", pti, apn_first_char, isprint(apn->value[0]) ? &apn->value[0] : &apn->value[1],
-            (pdn_type == ESM_PDN_TYPE_IPV4)? esm_data_get_ipv4_addr(pdn_addr) :
-            (pdn_type == ESM_PDN_TYPE_IPV6)? esm_data_get_ipv6_addr(pdn_addr) :
-            esm_data_get_ipv4v6_addr(pdn_addr));
+            (pdn_type == ESM_PDN_TYPE_IPV4)? esm_data_get_ipv4_addr(pdn_addr, str) :
+            (pdn_type == ESM_PDN_TYPE_IPV6)? esm_data_get_ipv6_addr(pdn_addr, str) :
+            esm_data_get_ipv4v6_addr(pdn_addr, str));
 
   /* Stop T3482 timer if running */
   esm_pt_stop_timer(esm_pt_data, pti);
diff --git a/openair3/NAS/UE/ESM/esmData.h b/openair3/NAS/UE/ESM/esmData.h
index 02bc0dd9307..7da659e801b 100644
--- a/openair3/NAS/UE/ESM/esmData.h
+++ b/openair3/NAS/UE/ESM/esmData.h
@@ -204,13 +204,8 @@ typedef esm_data_context_t esm_data_t;
 /******************  E X P O R T E D    F U N C T I O N S  ******************/
 /****************************************************************************/
 
-// FIXME prototype and buffer allocation
-extern char ip_addr_str[100];
-
-extern char *esm_data_get_ipv4_addr(const OctetString *ip_addr);
-
-extern char *esm_data_get_ipv6_addr(const OctetString *ip_addr);
-
-extern char *esm_data_get_ipv4v6_addr(const OctetString *ip_addr);
+char *esm_data_get_ipv4_addr(const OctetString *ip_addr, char *ret);
+char *esm_data_get_ipv6_addr(const OctetString *ip_addr, char *ret);
+char *esm_data_get_ipv4v6_addr(const OctetString *ip_addr, char *ret);
 
 #endif /* __ESMDATA_H__*/
diff --git a/openair3/NAS/UE/ESM/esm_ip.c b/openair3/NAS/UE/ESM/esm_ip.c
index 2638221a8f9..0743307f6e6 100644
--- a/openair3/NAS/UE/ESM/esm_ip.c
+++ b/openair3/NAS/UE/ESM/esm_ip.c
@@ -22,47 +22,43 @@
 #include "emmData.h"
 #include "esmData.h"
 
-// FIXME don't work for reentrant calls
-char ip_addr_str[100];
-
-// FIXME can't be extern and inline at same time !
-inline char *esm_data_get_ipv4_addr(const OctetString *ip_addr)
+char *esm_data_get_ipv4_addr(const OctetString *ip_addr, char *ret)
 {
   if (ip_addr->length > 0) {
-    sprintf(ip_addr_str, "%u.%u.%u.%u",
+    sprintf(ret, "%u.%u.%u.%u",
             ip_addr->value[0], ip_addr->value[1],
             ip_addr->value[2], ip_addr->value[3]);
-    return ip_addr_str;
+    return ret;
   }
 
   return (NULL);
 }
 
-inline char *esm_data_get_ipv6_addr(const OctetString *ip_addr)
+char *esm_data_get_ipv6_addr(const OctetString *ip_addr, char *ret)
 {
   if (ip_addr->length > 0) {
-    sprintf(ip_addr_str, "%x%.2x:%x%.2x:%x%.2x:%x%.2x",
+    sprintf(ret, "%x%.2x:%x%.2x:%x%.2x:%x%.2x",
             ip_addr->value[0], ip_addr->value[1],
             ip_addr->value[2], ip_addr->value[3],
             ip_addr->value[4], ip_addr->value[5],
             ip_addr->value[6], ip_addr->value[7]);
-    return ip_addr_str;
+    return ret;
   }
 
   return (NULL);
 }
 
-inline char *esm_data_get_ipv4v6_addr(const OctetString *ip_addr)
+char *esm_data_get_ipv4v6_addr(const OctetString *ip_addr, char *ret)
 {
   if (ip_addr->length > 0) {
-    sprintf(ip_addr_str, "%u.%u.%u.%u / %x%.2x:%x%.2x:%x%.2x:%x%.2x",
+    sprintf(ret, "%u.%u.%u.%u / %x%.2x:%x%.2x:%x%.2x:%x%.2x",
             ip_addr->value[0], ip_addr->value[1],
             ip_addr->value[2], ip_addr->value[3],
             ip_addr->value[4], ip_addr->value[5],
             ip_addr->value[6], ip_addr->value[7],
             ip_addr->value[8], ip_addr->value[9],
             ip_addr->value[10], ip_addr->value[11]);
-    return ip_addr_str;
+    return ret;
   }
 
   return (NULL);
-- 
GitLab