diff options
author | Martin Schwenke <martin@meltin.net> | 2014-06-11 16:04:55 +1000 |
---|---|---|
committer | Martin Schwenke <martins@samba.org> | 2014-06-12 05:40:10 +0200 |
commit | 8fa8b3b397853a29f12875454b890fa5c7b8cda8 (patch) | |
tree | 1c758743fcd3d2dace1e24cfe9d27f297fb7aa5e /ctdb | |
parent | 3a9d375328e78e58a20584cc138bd52f930f33b7 (diff) | |
download | samba-8fa8b3b397853a29f12875454b890fa5c7b8cda8.tar.gz samba-8fa8b3b397853a29f12875454b890fa5c7b8cda8.tar.xz samba-8fa8b3b397853a29f12875454b890fa5c7b8cda8.zip |
ctdb-common: Do not dynamically allocate memory when not necessary
Copy these values onto the stack instead. INET6_ADDRSTRLEN is 46, so
64 is plenty for an IP address and a port number.
Signed-off-by: Martin Schwenke <martin@meltin.net>
Reviewed-by: Amitay Isaacs <amitay@gmail.com>
Diffstat (limited to 'ctdb')
-rw-r--r-- | ctdb/common/ctdb_util.c | 36 |
1 files changed, 17 insertions, 19 deletions
diff --git a/ctdb/common/ctdb_util.c b/ctdb/common/ctdb_util.c index 5cba124422f..6a58448db81 100644 --- a/ctdb/common/ctdb_util.c +++ b/ctdb/common/ctdb_util.c @@ -470,23 +470,24 @@ static bool parse_ipv6(const char *s, const char *ifaces, unsigned port, ctdb_so */ bool parse_ip_port(const char *addr, ctdb_sock_addr *saddr) { - TALLOC_CTX *tmp_ctx = talloc_new(NULL); - char *s, *p; + char *p; + char s[64]; /* Much longer than INET6_ADDRSTRLEN */ unsigned port; char *endp = NULL; + ssize_t len; bool ret; - s = talloc_strdup(tmp_ctx, addr); - if (s == NULL) { - DEBUG(DEBUG_ERR, (__location__ " Failed strdup()\n")); - talloc_free(tmp_ctx); + len = strlen(addr); + if (len >= sizeof(s)) { + DEBUG(DEBUG_ERR, ("Address %s is unreasonably long\n", addr)); return false; } + strncpy(s, addr, len+1); + p = rindex(s, ':'); if (p == NULL) { DEBUG(DEBUG_ERR, (__location__ " This addr: %s does not contain a port number\n", s)); - talloc_free(tmp_ctx); return false; } @@ -494,7 +495,6 @@ bool parse_ip_port(const char *addr, ctdb_sock_addr *saddr) if (endp == NULL || *endp != 0) { /* trailing garbage */ DEBUG(DEBUG_ERR, (__location__ " Trailing garbage after the port in %s\n", s)); - talloc_free(tmp_ctx); return false; } *p = 0; @@ -503,7 +503,6 @@ bool parse_ip_port(const char *addr, ctdb_sock_addr *saddr) /* now is this a ipv4 or ipv6 address ?*/ ret = parse_ip(s, NULL, port, saddr); - talloc_free(tmp_ctx); return ret; } @@ -533,23 +532,25 @@ bool parse_ip(const char *addr, const char *ifaces, unsigned port, ctdb_sock_add */ bool parse_ip_mask(const char *str, const char *ifaces, ctdb_sock_addr *addr, unsigned *mask) { - TALLOC_CTX *tmp_ctx = talloc_new(NULL); - char *s, *p; + char *p; + char s[64]; /* Much longer than INET6_ADDRSTRLEN */ char *endp = NULL; + ssize_t len; bool ret; ZERO_STRUCT(*addr); - s = talloc_strdup(tmp_ctx, str); - if (s == NULL) { - DEBUG(DEBUG_ERR, (__location__ " Failed strdup()\n")); - talloc_free(tmp_ctx); + + len = strlen(str); + if (len >= sizeof(s)) { + DEBUG(DEBUG_ERR, ("Address %s is unreasonably long\n", str)); return false; } + strncpy(s, str, len+1); + p = rindex(s, '/'); if (p == NULL) { DEBUG(DEBUG_ERR, (__location__ " This addr: %s does not contain a mask\n", s)); - talloc_free(tmp_ctx); return false; } @@ -557,16 +558,13 @@ bool parse_ip_mask(const char *str, const char *ifaces, ctdb_sock_addr *addr, un if (endp == NULL || *endp != 0) { /* trailing garbage */ DEBUG(DEBUG_ERR, (__location__ " Trailing garbage after the mask in %s\n", s)); - talloc_free(tmp_ctx); return false; } *p = 0; - /* now is this a ipv4 or ipv6 address ?*/ ret = parse_ip(s, ifaces, 0, addr); - talloc_free(tmp_ctx); return ret; } |