diff options
author | Aravinda VK <avishwan@redhat.com> | 2017-01-05 11:28:44 +0530 |
---|---|---|
committer | Raghavendra G <rgowdapp@redhat.com> | 2017-01-05 20:24:18 -0800 |
commit | aa053b228e01ab079f86d24f3444b2389895effd (patch) | |
tree | 765fd27aaeea5bbc2f2bf129890fe346253400c6 | |
parent | c455c6030f1f1678ae66752e5e11ea988d062df4 (diff) |
eventsapi: Use `getaddrinfo` instead of `gethostbyname`
`gethostbyname` is not thread safe. Use `getaddrinfo` to avoid
any race or segfault while sending events
BUG: 1410313
Change-Id: I164af1f8eb72501fb0ed47445e68d896f7c3e908
Signed-off-by: Aravinda VK <avishwan@redhat.com>
Reviewed-on: http://review.gluster.org/16327
Reviewed-by: Atin Mukherjee <amukherj@redhat.com>
NetBSD-regression: NetBSD Build System <jenkins@build.gluster.org>
CentOS-regression: Gluster Build System <jenkins@build.gluster.org>
Smoke: Gluster Build System <jenkins@build.gluster.org>
Reviewed-by: Raghavendra G <rgowdapp@redhat.com>
-rw-r--r-- | libglusterfs/src/common-utils.h | 4 | ||||
-rw-r--r-- | libglusterfs/src/events.c | 25 |
2 files changed, 23 insertions, 6 deletions
diff --git a/libglusterfs/src/common-utils.h b/libglusterfs/src/common-utils.h index 324555b34f5..b77b7ad97de 100644 --- a/libglusterfs/src/common-utils.h +++ b/libglusterfs/src/common-utils.h @@ -868,4 +868,8 @@ gf_bits_index (uint64_t n); const char* gf_fop_string (glusterfs_fop_t fop); + +char * +get_ip_from_addrinfo (struct addrinfo *addr, char **ip); + #endif /* _COMMON_UTILS_H */ diff --git a/libglusterfs/src/events.c b/libglusterfs/src/events.c index 6b3a73d8ae4..27c421a7c74 100644 --- a/libglusterfs/src/events.c +++ b/libglusterfs/src/events.c @@ -17,7 +17,6 @@ #include <stdarg.h> #include <string.h> #include <netinet/in.h> -#include <arpa/inet.h> #include <netdb.h> #include "syscall.h" @@ -41,8 +40,9 @@ _gf_event (eventtypes_t event, char *fmt, ...) va_list arguments; char *msg = NULL; glusterfs_ctx_t *ctx = NULL; - struct hostent *host_data; char *host = NULL; + struct addrinfo hints; + struct addrinfo *result = NULL; /* Global context */ ctx = THIS->ctx; @@ -59,19 +59,26 @@ _gf_event (eventtypes_t event, char *fmt, ...) goto out; } + memset (&hints, 0, sizeof (hints)); + hints.ai_family = AF_UNSPEC; + /* Get Host name to send message */ if (ctx && ctx->cmd_args.volfile_server) { /* If it is client code then volfile_server is set use that information to push the events. */ - host_data = gethostbyname (ctx->cmd_args.volfile_server); - if (host_data == NULL) { + if ((getaddrinfo (ctx->cmd_args.volfile_server, + NULL, &hints, &result)) != 0) { + ret = EVENT_ERROR_RESOLVE; + goto out; + } + + if (get_ip_from_addrinfo (result, &host) == NULL) { ret = EVENT_ERROR_RESOLVE; goto out; } - host = inet_ntoa (*(struct in_addr *)(host_data->h_addr)); } else { /* Localhost, Use the defined IP for localhost */ - host = EVENT_HOST; + host = gf_strdup (EVENT_HOST); } /* Socket Configurations */ @@ -118,5 +125,11 @@ _gf_event (eventtypes_t event, char *fmt, ...) if (eventstr) GF_FREE (eventstr); + if (host) + GF_FREE (host); + + if (result) + freeaddrinfo (result); + return ret; } |