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