The branch, master has been updated via e7ef0c9 ctdb-common: Drop unused function mkdir_p_or_die() via 77242e7 ctdb-common: Drop function parse_ip_mask() and supporting functions via b1fed7e ctdb-daemon: Switch to using ctdb_sock_addr_mask_from_string() via efaa769 ctdb-tools: Switch to using ctdb_sock_addr_mask_from_string() via 4a1fb72 ctdb-protocol: Add function ctdb_sock_addr_mask_from_string() via 3b56f20 ctdb-protocol: Fix compilation issue with strncpy() via 5dd84bf ctdb-common: Fix compilation issue with strncpy() from 2dffcde smbd: Remove "share_mode_entry->lease"
https://git.samba.org/?p=samba.git;a=shortlog;h=master - Log ----------------------------------------------------------------- commit e7ef0c97e981ff6097eeca5b7ecf5136955b23fe Author: Martin Schwenke <mar...@meltin.net> Date: Fri Jun 8 18:48:07 2018 +1000 ctdb-common: Drop unused function mkdir_p_or_die() Signed-off-by: Martin Schwenke <mar...@meltin.net> Reviewed-by: Amitay Isaacs <ami...@gmail.com> Autobuild-User(master): Amitay Isaacs <ami...@samba.org> Autobuild-Date(master): Fri Jul 27 08:42:20 CEST 2018 on sn-devel-144 commit 77242e7631514b80a84146b2f4f232dab28d978b Author: Martin Schwenke <mar...@meltin.net> Date: Fri Jun 8 07:33:32 2018 +1000 ctdb-common: Drop function parse_ip_mask() and supporting functions Signed-off-by: Martin Schwenke <mar...@meltin.net> Reviewed-by: Amitay Isaacs <ami...@gmail.com> commit b1fed7e14c7e2bdfa88f8e502d5256c555dcae90 Author: Martin Schwenke <mar...@meltin.net> Date: Fri Jun 8 07:27:07 2018 +1000 ctdb-daemon: Switch to using ctdb_sock_addr_mask_from_string() Signed-off-by: Martin Schwenke <mar...@meltin.net> Reviewed-by: Amitay Isaacs <ami...@gmail.com> commit efaa7690d01faa1f24c21920666f644c9d42ca11 Author: Martin Schwenke <mar...@meltin.net> Date: Fri Jun 8 07:26:51 2018 +1000 ctdb-tools: Switch to using ctdb_sock_addr_mask_from_string() Signed-off-by: Martin Schwenke <mar...@meltin.net> Reviewed-by: Amitay Isaacs <ami...@gmail.com> commit 4a1fb7296ca1c32fbb85ade2d5f104690b83929b Author: Martin Schwenke <mar...@meltin.net> Date: Fri Jun 8 07:13:25 2018 +1000 ctdb-protocol: Add function ctdb_sock_addr_mask_from_string() Signed-off-by: Martin Schwenke <mar...@meltin.net> Reviewed-by: Amitay Isaacs <ami...@gmail.com> commit 3b56f2002a35b55b46958178c79aee519f0c5880 Author: Martin Schwenke <mar...@meltin.net> Date: Thu Jul 26 11:01:30 2018 +1000 ctdb-protocol: Fix compilation issue with strncpy() When configured with --picky-developer and using -O3 with gcc 8.1: ../protocol/protocol_util.c: In function ‘ctdb_sock_addr_from_string’: ../protocol/protocol_util.c:282:2: error: ‘strncpy’ specified bound depends on the length of the source argument [-Werror=stringop-overflow=] strncpy(s, str, len+1); ^~~~~~~~~~~~~~~~~~~~~~ ../protocol/protocol_util.c:277:8: note: length computed here len = strlen(str); ^~~~~~~~~~~ Use strlcpy() instead and check the result. BUG: https://bugzilla.samba.org/show_bug.cgi?id=13545 Signed-off-by: Martin Schwenke <mar...@meltin.net> Reviewed-by: Amitay Isaacs <ami...@gmail.com> commit 5dd84bf5d73e4afab094834bc317da7884b9b9b3 Author: Martin Schwenke <mar...@meltin.net> Date: Thu Jul 26 11:00:28 2018 +1000 ctdb-common: Fix compilation issue with strncpy() When configured with --picky-developer and using -O3 with gcc 8.1: ../common/system_socket.c: In function ‘parse_ip_mask’: ../common/system_socket.c:229:2: error: ‘strncpy’ specified bound depends on the length of the source argument [-Werror=stringop-overflow=] strncpy(s, str, len+1); ^~~~~~~~~~~~~~~~~~~~~~ ../common/system_socket.c:223:8: note: length computed here len = strlen(str); ^~~~~~~~~~~ Use strlcpy() instead and check the result. BUG: https://bugzilla.samba.org/show_bug.cgi?id=13545 Signed-off-by: Martin Schwenke <mar...@meltin.net> Reviewed-by: Amitay Isaacs <ami...@gmail.com> ----------------------------------------------------------------------- Summary of changes: ctdb/common/system.c | 14 ---- ctdb/common/system.h | 2 - ctdb/common/system_socket.c | 137 ------------------------------------ ctdb/common/system_socket.h | 5 -- ctdb/protocol/protocol_util.c | 45 +++++++++++- ctdb/protocol/protocol_util.h | 3 + ctdb/server/ctdb_takeover.c | 17 ++++- ctdb/tests/src/protocol_util_test.c | 35 +++++++++ ctdb/tools/ctdb.c | 3 +- 9 files changed, 97 insertions(+), 164 deletions(-) Changeset truncated at 500 lines: diff --git a/ctdb/common/system.c b/ctdb/common/system.c index a95f314..51149ed 100644 --- a/ctdb/common/system.c +++ b/ctdb/common/system.c @@ -143,20 +143,6 @@ void lockdown_memory(bool valgrinding) #endif } -void mkdir_p_or_die(const char *dir, int mode) -{ - int ret; - - ret = mkdir_p(dir, mode); - if (ret != 0) { - DEBUG(DEBUG_ALERT, - ("ctdb exiting with error: " - "failed to create directory \"%s\" (%s)\n", - dir, strerror(errno))); - exit(1); - } -} - void ctdb_wait_for_process_to_exit(pid_t pid) { while (kill(pid, 0) == 0 || errno != ESRCH) { diff --git a/ctdb/common/system.h b/ctdb/common/system.h index 8d558e2..042e7cc 100644 --- a/ctdb/common/system.h +++ b/ctdb/common/system.h @@ -29,8 +29,6 @@ void reset_scheduler(void); void lockdown_memory(bool valgrinding); -void mkdir_p_or_die(const char *dir, int mode); - void ctdb_wait_for_process_to_exit(pid_t pid); bool ctdb_sys_check_iface_exists(const char *iface); diff --git a/ctdb/common/system_socket.c b/ctdb/common/system_socket.c index d8627fd..562b2bf 100644 --- a/ctdb/common/system_socket.c +++ b/ctdb/common/system_socket.c @@ -112,143 +112,6 @@ bool ctdb_sys_have_ip(ctdb_sock_addr *_addr) return ret == 0; } -static bool parse_ipv4(const char *s, unsigned port, struct sockaddr_in *sin) -{ - sin->sin_family = AF_INET; - sin->sin_port = htons(port); - - if (inet_pton(AF_INET, s, &sin->sin_addr) != 1) { - DBG_ERR("Failed to translate %s into sin_addr\n", s); - return false; - } - -#ifdef HAVE_SOCK_SIN_LEN - sin->sin_len = sizeof(*sin); -#endif - return true; -} - -static bool parse_ipv6(const char *s, - const char *ifaces, - unsigned port, - ctdb_sock_addr *saddr) -{ - saddr->ip6.sin6_family = AF_INET6; - saddr->ip6.sin6_port = htons(port); - saddr->ip6.sin6_flowinfo = 0; - saddr->ip6.sin6_scope_id = 0; - - if (inet_pton(AF_INET6, s, &saddr->ip6.sin6_addr) != 1) { - DBG_ERR("Failed to translate %s into sin6_addr\n", s); - return false; - } - - if (ifaces && IN6_IS_ADDR_LINKLOCAL(&saddr->ip6.sin6_addr)) { - if (strchr(ifaces, ',')) { - DBG_ERR("Link local address %s " - "is specified for multiple ifaces %s\n", - s, ifaces); - return false; - } - saddr->ip6.sin6_scope_id = if_nametoindex(ifaces); - } - -#ifdef HAVE_SOCK_SIN6_LEN - saddr->ip6.sin6_len = sizeof(*saddr); -#endif - return true; -} - -static bool parse_ip(const char *addr, - const char *ifaces, - unsigned port, - ctdb_sock_addr *saddr) -{ - char *p; - bool ret; - - ZERO_STRUCTP(saddr); /* valgrind :-) */ - - /* - * IPv4 or IPv6 address? - * - * Use rindex() because we need the right-most ':' below for - * IPv4-mapped IPv6 addresses anyway... - */ - p = rindex(addr, ':'); - if (p == NULL) { - ret = parse_ipv4(addr, port, &saddr->ip); - } else { - uint8_t ipv4_mapped_prefix[12] = { - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0xff, 0xff - }; - - ret = parse_ipv6(addr, ifaces, port, saddr); - if (! ret) { - return ret; - } - - /* - * Check for IPv4-mapped IPv6 address - * (e.g. ::ffff:192.0.2.128) - reparse as IPv4 if - * necessary - */ - if (memcmp(&saddr->ip6.sin6_addr.s6_addr[0], - ipv4_mapped_prefix, - sizeof(ipv4_mapped_prefix)) == 0) { - /* Reparse as IPv4 */ - ret = parse_ipv4(p+1, port, &saddr->ip); - } - } - - return ret; -} - -/* - * Parse an ip/mask pair - */ -bool parse_ip_mask(const char *str, - const char *ifaces, - ctdb_sock_addr *addr, - unsigned *mask) -{ - char *p; - char s[64]; /* Much longer than INET6_ADDRSTRLEN */ - char *endp = NULL; - ssize_t len; - bool ret; - - ZERO_STRUCT(*addr); - - len = strlen(str); - if (len >= sizeof(s)) { - DBG_ERR("Address %s is unreasonably long\n", str); - return false; - } - - strncpy(s, str, len+1); - - p = rindex(s, '/'); - if (p == NULL) { - DBG_ERR("Address %s does not contain a mask\n", s); - return false; - } - - *mask = strtoul(p+1, &endp, 10); - if (endp == NULL || *endp != 0) { - /* trailing garbage */ - DBG_ERR("Trailing garbage after the mask in %s\n", s); - return false; - } - *p = 0; - - - /* now is this a ipv4 or ipv6 address ?*/ - ret = parse_ip(s, ifaces, 0, addr); - - return ret; -} - /* * simple TCP checksum - assumes data is multiple of 2 bytes long */ diff --git a/ctdb/common/system_socket.h b/ctdb/common/system_socket.h index eb2c6f7..065c53c 100644 --- a/ctdb/common/system_socket.h +++ b/ctdb/common/system_socket.h @@ -24,11 +24,6 @@ bool ctdb_sys_have_ip(ctdb_sock_addr *addr); -bool parse_ip_mask(const char *str, - const char *ifaces, - ctdb_sock_addr *addr, - unsigned *mask); - int ctdb_sys_send_arp(const ctdb_sock_addr *addr, const char *iface); int ctdb_sys_send_tcp(const ctdb_sock_addr *dest, diff --git a/ctdb/protocol/protocol_util.c b/ctdb/protocol/protocol_util.c index c75555f..69bd67b 100644 --- a/ctdb/protocol/protocol_util.c +++ b/ctdb/protocol/protocol_util.c @@ -274,13 +274,11 @@ int ctdb_sock_addr_from_string(const char *str, /* Parse out port number and then IP address */ - len = strlen(str); + len = strlcpy(s, str, sizeof(s)); if (len >= sizeof(s)) { return EINVAL; } - strncpy(s, str, len+1); - p = rindex(s, ':'); if (p == NULL) { return EINVAL; @@ -300,6 +298,47 @@ int ctdb_sock_addr_from_string(const char *str, return ret; } +int ctdb_sock_addr_mask_from_string(const char *str, + ctdb_sock_addr *addr, + unsigned int *mask) +{ + char *p; + char s[64]; /* Much longer than INET6_ADDRSTRLEN */ + unsigned int m; + char *endp = NULL; + ssize_t len; + bool ret; + + if (addr == NULL || mask == NULL) { + return EINVAL; + } + + len = strlcpy(s, str, sizeof(s)); + if (len >= sizeof(s)) { + return EINVAL; + } + + p = rindex(s, '/'); + if (p == NULL) { + return EINVAL; + } + + m = strtoul(p+1, &endp, 10); + if (endp == p+1 || *endp != '\0') { + /* Empty string or trailing garbage */ + return EINVAL; + } + + *p = '\0'; + ret = ip_from_string(s, addr); + + if (ret == 0) { + *mask = m; + } + + return ret; +} + unsigned int ctdb_sock_addr_port(ctdb_sock_addr *addr) { switch (addr->sa.sa_family) { diff --git a/ctdb/protocol/protocol_util.h b/ctdb/protocol/protocol_util.h index 66a4913..fa7189c 100644 --- a/ctdb/protocol/protocol_util.h +++ b/ctdb/protocol/protocol_util.h @@ -41,6 +41,9 @@ const char *ctdb_sock_addr_to_string(TALLOC_CTX *mem_ctx, ctdb_sock_addr *addr, bool with_port); int ctdb_sock_addr_from_string(const char *str, ctdb_sock_addr *addr, bool with_port); +int ctdb_sock_addr_mask_from_string(const char *str, + ctdb_sock_addr *addr, + unsigned int *mask); unsigned int ctdb_sock_addr_port(ctdb_sock_addr *addr); void ctdb_sock_addr_set_port(ctdb_sock_addr *addr, unsigned int port); int ctdb_sock_addr_cmp_ip(const ctdb_sock_addr *addr1, diff --git a/ctdb/server/ctdb_takeover.c b/ctdb/server/ctdb_takeover.c index 3f5536d..95663af 100644 --- a/ctdb/server/ctdb_takeover.c +++ b/ctdb/server/ctdb_takeover.c @@ -33,6 +33,8 @@ #include "lib/util/sys_rw.h" #include "lib/util/util_process.h" +#include "protocol/protocol_util.h" + #include "ctdb_private.h" #include "ctdb_client.h" @@ -1156,6 +1158,7 @@ int ctdb_set_public_addresses(struct ctdb_context *ctdb, bool check_addresses) const char *addrstr; const char *ifaces; char *tok, *line; + int ret; line = lines[i]; while ((*line == ' ') || (*line == '\t')) { @@ -1179,11 +1182,21 @@ int ctdb_set_public_addresses(struct ctdb_context *ctdb, bool check_addresses) } ifaces = tok; - if (!addrstr || !parse_ip_mask(addrstr, ifaces, &addr, &mask)) { - DEBUG(DEBUG_CRIT,("Badly formed line %u in public address list\n", i+1)); + if (addrstr == NULL) { + D_ERR("Badly formed line %u in public address list\n", + i+1); talloc_free(lines); return -1; } + + ret = ctdb_sock_addr_mask_from_string(addrstr, &addr, &mask); + if (ret != 0) { + D_ERR("Badly formed line %u in public address list\n", + i+1); + talloc_free(lines); + return -1; + } + if (ctdb_add_public_address(ctdb, &addr, mask, ifaces, check_addresses)) { DEBUG(DEBUG_CRIT,("Failed to add line %u to the public address list\n", i+1)); talloc_free(lines); diff --git a/ctdb/tests/src/protocol_util_test.c b/ctdb/tests/src/protocol_util_test.c index eb7eb0f..9b4729e 100644 --- a/ctdb/tests/src/protocol_util_test.c +++ b/ctdb/tests/src/protocol_util_test.c @@ -73,6 +73,36 @@ static void test_sock_addr_cmp(const char *ip1, const char *ip2, } /* + * Test parsing of IP/mask, conversion to string + */ + +static void test_sock_addr_mask_from_string(const char *ip_mask) +{ + ctdb_sock_addr sa; + unsigned mask; + const char *s, *t; + int ret; + + ret = ctdb_sock_addr_mask_from_string(ip_mask, &sa, &mask); + assert(ret == 0); + s = ctdb_sock_addr_to_string(NULL, &sa, false); + assert(s != NULL); + t = talloc_asprintf(s, "%s/%u", s, mask); + assert(strcmp(ip_mask, t) == 0); + talloc_free(discard_const(s)); +} + +static void test_sock_addr_mask_from_string_bad(const char *ip_mask) +{ + ctdb_sock_addr sa; + unsigned mask; + int ret; + + ret = ctdb_sock_addr_mask_from_string(ip_mask, &sa, &mask); + assert(ret == EINVAL); +} + +/* * Test parsing of connection, conversion to string */ @@ -324,6 +354,11 @@ int main(int argc, char *argv[]) test_sock_addr_cmp("fe80::6af7:28ff:fefa:d136:123", "fe80::6af7:28ff:fefa:d136:122" , true, 1); + test_sock_addr_mask_from_string("127.0.0.1/8"); + test_sock_addr_mask_from_string("::1/128"); + test_sock_addr_mask_from_string("fe80::6af7:28ff:fefa:d136/64"); + test_sock_addr_mask_from_string_bad("127.0.0.1"); + test_connection_to_string("127.0.0.1:12345 127.0.0.2:54321"); test_connection_to_string("fe80::6af7:28ff:fefa:d137:12345 " "fe80::6af7:28ff:fefa:d138:54321"); diff --git a/ctdb/tools/ctdb.c b/ctdb/tools/ctdb.c index 9d5d7b8..771632c 100644 --- a/ctdb/tools/ctdb.c +++ b/ctdb/tools/ctdb.c @@ -3849,7 +3849,8 @@ static int control_addip(TALLOC_CTX *mem_ctx, struct ctdb_context *ctdb, usage("addip"); } - if (! parse_ip_mask(argv[0], argv[1], &addr, &mask)) { + ret = ctdb_sock_addr_mask_from_string(argv[0], &addr, &mask); + if (ret != 0) { fprintf(stderr, "Invalid IP/Mask %s\n", argv[0]); return 1; } -- Samba Shared Repository