The branch, master has been updated via 7163846a491 ctdb-protocol: Print IPv6 sockets with RFC5952 "[2001:db8::1]:80" notation via 255fe69c90f ctdb-tests: Add extra IPv6 socket parsing tests via 224e99804ef ctdb-protocol: Allow rfc5952 "[2001:db8::1]:80" ipv6 notation via 820b0a63cca ctdb-protocol: Save 50 bytes .text segment via baaedd69b3e ctdb-protocol: rindex->strrchr from 8c0391d38e5 dsdb/schema: let dsdb_syntax_DN_BINARY_drsuapi_to_ldb return WERR_DS_INVALID_ATTRIBUTE_SYNTAX
https://git.samba.org/?p=samba.git;a=shortlog;h=master - Log ----------------------------------------------------------------- commit 7163846a49165cc3d70b2b20909af2ed19778e7a Author: Martin Schwenke <mar...@meltin.net> Date: Thu Dec 30 12:29:58 2021 +1100 ctdb-protocol: Print IPv6 sockets with RFC5952 "[2001:db8::1]:80" notation RFC5952 says the existing style is not recommended and the [] style should be employed. There are more optimised ways of adding the square brackets but they tend to be uglier. Parsing IPv6 sockets without [] is now tested indirectly by parsing examples in both styles and comparing the results. Signed-off-by: Martin Schwenke <mar...@meltin.net> Signed-off-by: Volker Lendecke <v...@samba.org> Autobuild-User(master): Volker Lendecke <v...@samba.org> Autobuild-Date(master): Thu Jan 13 17:02:21 UTC 2022 on sn-devel-184 commit 255fe69c90fb0d437d26ce0a6966841b3663aa05 Author: Martin Schwenke <mar...@meltin.net> Date: Wed Jan 5 12:09:45 2022 +1100 ctdb-tests: Add extra IPv6 socket parsing tests Add tests to confirm that square brackets are handled and that IPv4-mapped IPv6 addresses are parsed as expected. Signed-off-by: Martin Schwenke <mar...@meltin.net> Reviewed-by: Volker Lendecke <v...@samba.org> commit 224e99804efef960ef4ce2ff2f4f6dced1e74146 Author: Volker Lendecke <v...@samba.org> Date: Thu Dec 23 11:52:38 2021 +0100 ctdb-protocol: Allow rfc5952 "[2001:db8::1]:80" ipv6 notation Bug: https://bugzilla.samba.org/show_bug.cgi?id=14934 Signed-off-by: Volker Lendecke <v...@samba.org> Reviewed-by: Martin Schwenke <mar...@meltin.net> commit 820b0a63ccaceb4d66b18e3bcd585400a0b99ed2 Author: Volker Lendecke <v...@samba.org> Date: Wed Dec 29 14:46:14 2021 +0100 ctdb-protocol: Save 50 bytes .text segment Having this as a small static .text is simpler than having to create this on the stack. Signed-off-by: Volker Lendecke <v...@samba.org> Reviewed-by: Martin Schwenke <mar...@meltin.net> commit baaedd69b3e02cdef06353bd5a21a5c5e6079604 Author: Volker Lendecke <v...@samba.org> Date: Wed Dec 29 15:10:28 2021 +0100 ctdb-protocol: rindex->strrchr According to "man rindex" on debian bullseye rindex() was deprecated in Posix.1-2001 and removed from Posix.1-2008. Signed-off-by: Volker Lendecke <v...@samba.org> Reviewed-by: Martin Schwenke <mar...@meltin.net> ----------------------------------------------------------------------- Summary of changes: ctdb/protocol/protocol_util.c | 52 ++++++++++++++++++++----- ctdb/tests/UNIT/cunit/system_socket_test_002.sh | 10 +++-- ctdb/tests/src/protocol_util_test.c | 49 ++++++++++++++++------- 3 files changed, 83 insertions(+), 28 deletions(-) Changeset truncated at 500 lines: diff --git a/ctdb/protocol/protocol_util.c b/ctdb/protocol/protocol_util.c index 2d0a6f33038..28631c8de61 100644 --- a/ctdb/protocol/protocol_util.c +++ b/ctdb/protocol/protocol_util.c @@ -119,6 +119,7 @@ int ctdb_sock_addr_to_buf(char *buf, socklen_t buflen, ctdb_sock_addr *addr, bool with_port) { const char *t; + size_t len = 0; switch (addr->sa.sa_family) { case AF_INET: @@ -127,15 +128,36 @@ int ctdb_sock_addr_to_buf(char *buf, socklen_t buflen, if (t == NULL) { return errno; } + if (with_port) { + len = strlen(buf); + } break; - case AF_INET6: - t = inet_ntop(addr->ip6.sin6_family, &addr->ip6.sin6_addr, - buf, buflen); + case AF_INET6: { + char tmp[INET6_ADDRSTRLEN]; + + t = inet_ntop(addr->ip6.sin6_family, + &addr->ip6.sin6_addr, + tmp, + sizeof(tmp)); if (t == NULL) { return errno; } + + if (with_port) { + int ret = snprintf(buf, buflen, "[%s]", tmp); + if (ret < 0) { + return ENOSPC; + } + len = (size_t)ret; + } else { + len = strlcpy(buf, tmp, buflen); + } + if (len >= buflen){ + return ENOSPC; + } break; + } default: return EAFNOSUPPORT; @@ -143,7 +165,6 @@ int ctdb_sock_addr_to_buf(char *buf, socklen_t buflen, } if (with_port) { - size_t len = strlen(buf); int ret; ret = snprintf(buf+len, buflen-len, @@ -230,16 +251,29 @@ static int ip_from_string(const char *str, ctdb_sock_addr *addr) /* IPv4 or IPv6 address? * - * Use rindex() because we need the right-most ':' below for + * Use strrchr() because we need the right-most ':' below for * IPv4-mapped IPv6 addresses anyway... */ - p = rindex(str, ':'); + p = strrchr(str, ':'); if (p == NULL) { ret = ipv4_from_string(str, &addr->ip); } else { - uint8_t ipv4_mapped_prefix[12] = { + static const uint8_t ipv4_mapped_prefix[12] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0xff, 0xff }; + size_t len = strlen(str); + char s[64]; + + len = strlcpy(s, str, sizeof(s)); + if (len >= sizeof(s)) { + return EINVAL; + } + + if ((len >= 2) && (s[0] == '[') && (s[len-1] == ']')) { + s[len-1] = '\0'; + str = s+1; + p = strrchr(str, ':'); + } ret = ipv6_from_string(str, &addr->ip6); if (ret != 0) { @@ -286,7 +320,7 @@ int ctdb_sock_addr_from_string(const char *str, return EINVAL; } - p = rindex(s, ':'); + p = strrchr(s, ':'); if (p == NULL) { return EINVAL; } @@ -324,7 +358,7 @@ int ctdb_sock_addr_mask_from_string(const char *str, return EINVAL; } - p = rindex(s, '/'); + p = strrchr(s, '/'); if (p == NULL) { return EINVAL; } diff --git a/ctdb/tests/UNIT/cunit/system_socket_test_002.sh b/ctdb/tests/UNIT/cunit/system_socket_test_002.sh index 8bea074bd8d..417ad8f4792 100755 --- a/ctdb/tests/UNIT/cunit/system_socket_test_002.sh +++ b/ctdb/tests/UNIT/cunit/system_socket_test_002.sh @@ -38,7 +38,8 @@ ok <<EOF 000030 00 00 00 00 50 10 04 d2 0f c0 00 00 00003c EOF -tcp_test "fe80::6af7:28ff:fefa:d136:445" "fe80::6af7:28ff:fefb:d137:54321" 0 0 0 +tcp_test "[fe80::6af7:28ff:fefa:d136]:445" \ + "[fe80::6af7:28ff:fefb:d137]:54321" 0 0 0 ok <<EOF 000000 60 00 00 00 00 14 06 40 fe 80 00 00 00 00 00 00 @@ -47,7 +48,8 @@ ok <<EOF 000030 00 00 00 00 50 14 04 d2 0f bc 00 00 00003c EOF -tcp_test "fe80::6af7:28ff:fefa:d136:445" "fe80::6af7:28ff:fefb:d137:54321" 0 0 1 +tcp_test "[fe80::6af7:28ff:fefa:d136]:445" \ + "[fe80::6af7:28ff:fefb:d137]:54321" 0 0 1 ok <<EOF 000000 60 00 00 00 00 14 06 40 fe 80 00 00 00 00 00 00 @@ -56,5 +58,5 @@ ok <<EOF 000030 a0 5b 00 00 50 14 04 d2 36 30 00 00 00003c EOF -tcp_test "fe80::6af7:28ff:fefa:d136:445" \ - "fe80::6af7:28ff:fefb:d137:54321" 12345 23456 1 +tcp_test "[fe80::6af7:28ff:fefa:d136]:445" \ + "[fe80::6af7:28ff:fefb:d137]:54321" 12345 23456 1 diff --git a/ctdb/tests/src/protocol_util_test.c b/ctdb/tests/src/protocol_util_test.c index edd2a3411a0..4ffe58c680c 100644 --- a/ctdb/tests/src/protocol_util_test.c +++ b/ctdb/tests/src/protocol_util_test.c @@ -307,20 +307,20 @@ static void test_connection_list_read_bad(const char *s1) #define CONN6 \ "\ -fe80::6af7:28ff:fefa:d136:12345 fe80::6af7:28ff:fefa:d137:54321\n\ -fe80::6af7:28ff:fefa:d138:12345 fe80::6af7:28ff:fefa:d137:54322\n\ -fe80::6af7:28ff:fefa:d136:12346 fe80::6af7:28ff:fefa:d137:54323\n\ -fe80::6af7:28ff:fefa:d132:12345 fe80::6af7:28ff:fefa:d137:54324\n\ -fe80::6af7:28ff:fefa:d136:12345 fe80::6af7:28ff:fefa:d137:54325\n\ +[fe80::6af7:28ff:fefa:d136]:12345 [fe80::6af7:28ff:fefa:d137]:54321\n\ +[fe80::6af7:28ff:fefa:d138]:12345 [fe80::6af7:28ff:fefa:d137]:54322\n\ +[fe80::6af7:28ff:fefa:d136]:12346 [fe80::6af7:28ff:fefa:d137]:54323\n\ +[fe80::6af7:28ff:fefa:d132]:12345 [fe80::6af7:28ff:fefa:d137]:54324\n\ +[fe80::6af7:28ff:fefa:d136]:12345 [fe80::6af7:28ff:fefa:d137]:54325\n\ " #define CONN6_SORT \ "\ -fe80::6af7:28ff:fefa:d132:12345 fe80::6af7:28ff:fefa:d137:54324\n\ -fe80::6af7:28ff:fefa:d136:12345 fe80::6af7:28ff:fefa:d137:54321\n\ -fe80::6af7:28ff:fefa:d136:12345 fe80::6af7:28ff:fefa:d137:54325\n\ -fe80::6af7:28ff:fefa:d136:12346 fe80::6af7:28ff:fefa:d137:54323\n\ -fe80::6af7:28ff:fefa:d138:12345 fe80::6af7:28ff:fefa:d137:54322\n\ +[fe80::6af7:28ff:fefa:d132]:12345 [fe80::6af7:28ff:fefa:d137]:54324\n\ +[fe80::6af7:28ff:fefa:d136]:12345 [fe80::6af7:28ff:fefa:d137]:54321\n\ +[fe80::6af7:28ff:fefa:d136]:12345 [fe80::6af7:28ff:fefa:d137]:54325\n\ +[fe80::6af7:28ff:fefa:d136]:12346 [fe80::6af7:28ff:fefa:d137]:54323\n\ +[fe80::6af7:28ff:fefa:d138]:12345 [fe80::6af7:28ff:fefa:d137]:54322\n\ " int main(int argc, char *argv[]) @@ -333,9 +333,9 @@ int main(int argc, char *argv[]) test_sock_addr_to_string("0.0.0.0:0", true); test_sock_addr_to_string("127.0.0.1:123", true); - test_sock_addr_to_string("::1:234", true); + test_sock_addr_to_string("[::1]:234", true); test_sock_addr_to_string("192.168.2.1:123", true); - test_sock_addr_to_string("fe80::6af7:28ff:fefa:d136:234", true); + test_sock_addr_to_string("[fe80::6af7:28ff:fefa:d136]:234", true); test_sock_addr_from_string_bad("0.0.0", false); test_sock_addr_from_string_bad("0.0.0:0", true); @@ -367,19 +367,38 @@ int main(int argc, char *argv[]) test_sock_addr_cmp("fe80::6af7:28ff:fefa:d136:123", "fe80::6af7:28ff:fefa:d136:122" , true, 1); + /* + * Confirm equivalence of IPv6 sockets with and without + * square-brackets + */ + test_sock_addr_cmp("[::1]:234", "::1:234", true, 0); + test_sock_addr_cmp("[fe80::6af7:28ff:fefa:d136]:234", + "fe80::6af7:28ff:fefa:d136:234", + true, + 0); + /* Check IPv4-mapped IPv6 addresses */ + test_sock_addr_cmp("::ffff:172.16.0.27:977", + "172.16.0.27:977", + true, + 0); + test_sock_addr_cmp("[::ffff:172.16.0.27]:977", + "172.16.0.27:977", + true, + 0); + 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"); + test_connection_to_string("[fe80::6af7:28ff:fefa:d137]:12345 " + "[fe80::6af7:28ff:fefa:d138]:54321"); test_connection_from_string_bad("127.0.0.1:12345 127.0.0.2:"); test_connection_from_string_bad("127.0.0.1:12345"); test_connection_from_string_bad("127.0.0.1:12345 " - "fe80::6af7:28ff:fefa:d136:122"); + "[fe80::6af7:28ff:fefa:d136]:122"); test_connection_from_string_bad("Junk!"); test_connection_from_string_bad("More junk"); -- Samba Shared Repository