From f7bbe755293a33cbf64e7e957ea0dfa58abc4b7f Mon Sep 17 00:00:00 2001 From: "hyunuk.tak" Date: Tue, 15 Oct 2019 14:57:57 +0900 Subject: [PATCH] Use strerror_r function for thread safety Change-Id: Ibe007510349c923a79e47a78dcb4697d141acdb7 Signed-off-by: hyunuk.tak --- src/clatd.c | 10 ++++++++-- src/ifc_utils.c | 38 ++++++++++++++++++++++++++++++-------- src/main.c | 23 +++++++++++++++++------ 3 files changed, 55 insertions(+), 16 deletions(-) diff --git a/src/clatd.c b/src/clatd.c index 7333632..de03a36 100644 --- a/src/clatd.c +++ b/src/clatd.c @@ -57,6 +57,9 @@ /* 40 bytes IPv6 header - 20 bytes IPv4 header + 8 bytes fragment header */ #define MTU_DELTA 28 +#if defined TIZEN_EXT +#define MAX_SIZE_ERROR_BUFFER 256 +#endif volatile sig_atomic_t running = 1; @@ -497,15 +500,18 @@ void configure_interface(const char *uplink_interface, const char *plat_prefix, } #if defined TIZEN_EXT + char error_buf[MAX_SIZE_ERROR_BUFFER] = {0, }; int error = tun_alloc(tunnel->device4, tunnel->fd4, sizeof(tunnel->device4)); if (error < 0) { - CLATD_LOG(LOG_FATAL, "tun_alloc/4 failed: %s", strerror(errno)); + CLATD_LOG(LOG_FATAL, "tun_alloc/4 failed: %s", + strerror_r(errno, error_buf, MAX_SIZE_ERROR_BUFFER)); return; } error = set_nonblocking(tunnel->fd4); if (error < 0) { - CLATD_LOG(LOG_FATAL, "set_nonblocking failed: %s", strerror(errno)); + CLATD_LOG(LOG_FATAL, "set_nonblocking failed: %s", + strerror_r(errno, error_buf, MAX_SIZE_ERROR_BUFFER)); return; } #endif diff --git a/src/ifc_utils.c b/src/ifc_utils.c index 3833384..a4c2d52 100644 --- a/src/ifc_utils.c +++ b/src/ifc_utils.c @@ -62,6 +62,9 @@ void printerr(char *fmt, ...); #define DBG 0 #endif +#if defined TIZEN_EXT +#define MAX_SIZE_ERROR_BUFFER 256 +#endif #define INET_ADDRLEN 4 #define INET6_ADDRLEN 16 @@ -125,13 +128,17 @@ int string_to_ip(const char *string, struct sockaddr_storage *ss) int ifc_init(void) { int ret; +#if defined TIZEN_EXT + char error_buf[MAX_SIZE_ERROR_BUFFER] = {0, }; +#endif pthread_mutex_lock(&ifc_sock_mutex); if (ifc_ctl_sock == -1) { ifc_ctl_sock = socket(AF_INET, SOCK_DGRAM | SOCK_CLOEXEC, 0); if (ifc_ctl_sock < 0) { #if defined TIZEN_EXT - CLATD_LOG(LOG_ERROR, "socket() failed: %s", strerror(errno)); + CLATD_LOG(LOG_ERROR, "socket() failed: %s", + strerror_r(errno, error_buf, MAX_SIZE_ERROR_BUFFER)); #else printerr("socket() failed: %s\n", strerror(errno)); #endif @@ -147,12 +154,17 @@ int ifc_init(void) int ifc_init6(void) { +#if defined TIZEN_EXT + char error_buf[MAX_SIZE_ERROR_BUFFER] = {0, }; +#endif + pthread_mutex_lock(&ifc_sock6_mutex); if (ifc_ctl_sock6 == -1) { ifc_ctl_sock6 = socket(AF_INET6, SOCK_DGRAM | SOCK_CLOEXEC, 0); if (ifc_ctl_sock6 < 0) { #if defined TIZEN_EXT - CLATD_LOG(LOG_ERROR, "socket() failed: %s", strerror(errno)); + CLATD_LOG(LOG_ERROR, "socket() failed: %s", + strerror_r(errno, error_buf, MAX_SIZE_ERROR_BUFFER)); #else printerr("socket() failed: %s\n", strerror(errno)); #endif @@ -696,6 +708,9 @@ int ifc_remove_default_route(const char *ifname) { struct rtentry rt; int result; +#if defined TIZEN_EXT + char error_buf[MAX_SIZE_ERROR_BUFFER] = {0, }; +#endif ifc_init(); memset(&rt, 0, sizeof(rt)); @@ -704,7 +719,8 @@ int ifc_remove_default_route(const char *ifname) init_sockaddr_in(&rt.rt_dst, 0); if ((result = ioctl(ifc_ctl_sock, SIOCDELRT, &rt)) < 0) { #if defined TIZEN_EXT - CLATD_LOG(LOG_ERROR, "failed to remove default route for %s: %s", ifname, strerror(errno)); + CLATD_LOG(LOG_ERROR, "failed to remove default route for %s: %s", + ifname, strerror_r(errno, error_buf, MAX_SIZE_ERROR_BUFFER)); #else ALOGD("failed to remove default route for %s: %s", ifname, strerror(errno)); #endif @@ -721,7 +737,9 @@ ifc_configure(const char *ifname, in_addr_t dns1, in_addr_t dns2) { -#if !defined TIZEN_EXT +#if defined TIZEN_EXT + char error_buf[MAX_SIZE_ERROR_BUFFER] = {0, }; +#else char dns_prop_name[PROPERTY_KEY_MAX]; #endif @@ -729,7 +747,8 @@ ifc_configure(const char *ifname, if (ifc_up(ifname)) { #if defined TIZEN_EXT - CLATD_LOG(LOG_ERROR, "failed to turn on interface %s: %s", ifname, strerror(errno)); + CLATD_LOG(LOG_ERROR, "failed to turn on interface %s: %s", + ifname, strerror_r(errno, error_buf, MAX_SIZE_ERROR_BUFFER)); #else printerr("failed to turn on interface %s: %s\n", ifname, strerror(errno)); #endif @@ -738,7 +757,8 @@ ifc_configure(const char *ifname, } if (ifc_set_addr(ifname, address)) { #if defined TIZEN_EXT - CLATD_LOG(LOG_ERROR, "failed to set ipaddr %s: %s", ipaddr_to_string(address), strerror(errno)); + CLATD_LOG(LOG_ERROR, "failed to set ipaddr %s: %s", + ipaddr_to_string(address), strerror_r(errno, error_buf, MAX_SIZE_ERROR_BUFFER)); #else printerr("failed to set ipaddr %s: %s\n", ipaddr_to_string(address), strerror(errno)); #endif @@ -747,7 +767,8 @@ ifc_configure(const char *ifname, } if (ifc_set_prefixLength(ifname, prefixLength)) { #if defined TIZEN_EXT - CLATD_LOG(LOG_ERROR, "failed to set prefixLength %d: %s", prefixLength, strerror(errno)); + CLATD_LOG(LOG_ERROR, "failed to set prefixLength %d: %s", + prefixLength, strerror_r(errno, error_buf, MAX_SIZE_ERROR_BUFFER)); #else printerr("failed to set prefixLength %d: %s\n", prefixLength, strerror(errno)); #endif @@ -756,7 +777,8 @@ ifc_configure(const char *ifname, } if (ifc_create_default_route(ifname, gateway)) { #if defined TIZEN_EXT - CLATD_LOG(LOG_ERROR, "failed to set default route %s: %s", ipaddr_to_string(gateway), strerror(errno)); + CLATD_LOG(LOG_ERROR, "failed to set default route %s: %s", + ipaddr_to_string(gateway), strerror_r(errno, error_buf, MAX_SIZE_ERROR_BUFFER)); #else printerr("failed to set default route %s: %s\n", ipaddr_to_string(gateway), strerror(errno)); #endif diff --git a/src/main.c b/src/main.c index 065dd0b..c883d78 100644 --- a/src/main.c +++ b/src/main.c @@ -58,6 +58,8 @@ void print_help() { } #if defined(TIZEN_EXT) +#define MAX_SIZE_ERROR_BUFFER 256 + static void _graceful_terminate(gpointer data); static gboolean on_sigterm(gpointer user_data); @@ -100,6 +102,7 @@ static gboolean _method_start(GDBusInterfaceSkeleton *di, unsigned net_id = NETID_UNSET; uint32_t mark = MARK_UNSET; unsigned len = 0; + char error_buf[MAX_SIZE_ERROR_BUFFER] = {0, }; cl = user_data; @@ -180,7 +183,7 @@ static gboolean _method_start(GDBusInterfaceSkeleton *di, CLATD_LOG(LOG_INFO, "Starting clat version %s on %s netid=%s mark=%s", CLATD_VERSION, uplink_interface,net_id_str ? net_id_str : "(none)", - mark_str ? mark_str : "(none)", + mark_str ? mark_str : "(none)", plat_prefix ? plat_prefix : "(none)", v4_addr ? v4_addr : "(none)", v6_addr ? v6_addr : "(none)"); @@ -198,7 +201,8 @@ static gboolean _method_start(GDBusInterfaceSkeleton *di, // we can create tun devices as non-root because we're in the VPN group. cl->tunnel.fd4 = tun_open(); if (cl->tunnel.fd4 < 0) { - CLATD_LOG(LOG_FATAL, "tun_open4 failed: %s", strerror(errno)); + CLATD_LOG(LOG_FATAL, "tun_open4 failed: %s", + strerror_r(errno, error_buf, MAX_SIZE_ERROR_BUFFER)); goto error_case; } @@ -238,15 +242,18 @@ static gboolean _method_stop(GDBusInterfaceSkeleton *di, GDBusMethodInvocation *invoc, gpointer user_data) { struct _clat *cl = 0; + char error_buf[MAX_SIZE_ERROR_BUFFER] = {0, }; cl = user_data; //< RNTFIX::to make clat4 interface persistently if (if_down(cl->tunnel.device4) < 0) { - CLATD_LOG(LOG_FATAL, "if_down failed: %s", strerror(errno)); + CLATD_LOG(LOG_FATAL, "if_down failed: %s", + strerror_r(errno, error_buf, MAX_SIZE_ERROR_BUFFER)); } if (delete_address(cl->tunnel.device4, AF_INET, &Global_Clatd_Config.ipv4_local_subnet, 32) < 0) { - CLATD_LOG(LOG_FATAL, "delete_address failed: %s", strerror(errno)); + CLATD_LOG(LOG_FATAL, "delete_address failed: %s", + strerror_r(errno, error_buf, MAX_SIZE_ERROR_BUFFER)); } //> RNTFIX::to make clat4 interface persistently @@ -263,16 +270,20 @@ static gboolean _method_stop(GDBusInterfaceSkeleton *di, static void _graceful_terminate(gpointer data) { struct _clat *cl = NULL; + char error_buf[MAX_SIZE_ERROR_BUFFER] = {0, }; + cl = (struct _clat *)data; CLATD_LOG(LOG_INFO, "terminate gracfully"); errno = 0; if (if_down(cl->tunnel.device4) < 0) - CLATD_LOG(LOG_FATAL, "if_down failed: %s", strerror(errno)); + CLATD_LOG(LOG_FATAL, "if_down failed: %s", + strerror_r(errno, error_buf, MAX_SIZE_ERROR_BUFFER)); errno = 0; if (delete_address(cl->tunnel.device4, AF_INET, &Global_Clatd_Config.ipv4_local_subnet, 32) < 0) - CLATD_LOG(LOG_FATAL, "delete_address failed: %s", strerror(errno)); + CLATD_LOG(LOG_FATAL, "delete_address failed: %s", + strerror_r(errno, error_buf, MAX_SIZE_ERROR_BUFFER)); CLATD_LOG(LOG_INFO, "Shutting down clat on %s", cl->tunnel.device4); del_anycast_address(cl->tunnel.write_fd6, &Global_Clatd_Config.ipv6_local_subnet); -- 2.7.4