From 6c31911a964f42f83d7f6b7c86ad40c17c71fcea Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A1n=20Tomko?= Date: Tue, 7 Oct 2014 17:27:40 +0200 Subject: [PATCH] Introduce virStringStripIPv6Brackets Helper function to strip the brackets from an IPv6 address. Tested by viruritest. --- src/libvirt_private.syms | 1 + src/util/virstring.c | 23 +++++++++++++++++++ src/util/virstring.h | 2 ++ src/util/viruri.c | 20 ++++------------ tests/virstringtest.c | 49 ++++++++++++++++++++++++++++++++++++++++ 5 files changed, 79 insertions(+), 16 deletions(-) diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms index d6265acd66..c5397ddfbd 100644 --- a/src/libvirt_private.syms +++ b/src/libvirt_private.syms @@ -2004,6 +2004,7 @@ virStringSortCompare; virStringSortRevCompare; virStringSplit; virStringSplitCount; +virStringStripIPv6Brackets; virStrncpy; virStrndup; virStrToDouble; diff --git a/src/util/virstring.c b/src/util/virstring.c index 54c0b6fb93..df6464a3bf 100644 --- a/src/util/virstring.c +++ b/src/util/virstring.c @@ -929,3 +929,26 @@ virStringReplace(const char *haystack, return virBufferContentAndReset(&buf); } + + +/** + * virStringStripIPv6Brackets: + * @str: the string to strip + * + * Modify the string in-place to remove the leading and closing brackets + * from an IPv6 address. + */ +void +virStringStripIPv6Brackets(char *str) +{ + size_t len; + + if (!str) + return; + + len = strlen(str); + if (str[0] == '[' && str[len - 1] == ']' && strchr(str, ':')) { + memmove(&str[0], &str[1], len - 2); + str[len - 2] = '\0'; + } +} diff --git a/src/util/virstring.h b/src/util/virstring.h index b82ef2af36..40ebaebb79 100644 --- a/src/util/virstring.h +++ b/src/util/virstring.h @@ -268,4 +268,6 @@ char *virStringReplace(const char *haystack, const char *newneedle) ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2) ATTRIBUTE_NONNULL(3); +void virStringStripIPv6Brackets(char *str); + #endif /* __VIR_STRING_H__ */ diff --git a/src/util/viruri.c b/src/util/viruri.c index 23d86c52e7..6166c372b0 100644 --- a/src/util/viruri.c +++ b/src/util/viruri.c @@ -182,22 +182,10 @@ virURIParse(const char *uri) if (VIR_STRDUP(ret->user, xmluri->user) < 0) goto error; - /* First check: does it even make sense to jump inside */ - if (ret->server != NULL && - ret->server[0] == '[') { - size_t length = strlen(ret->server); - - /* We want to modify the server string only if there are - * square brackets on both ends and inside there is IPv6 - * address. Otherwise we could make a mistake by modifying - * something other than an IPv6 address. */ - if (ret->server[length - 1] == ']' && strchr(ret->server, ':')) { - memmove(&ret->server[0], &ret->server[1], length - 2); - ret->server[length - 2] = '\0'; - } - /* Even after such modification, it is completely ok to free - * the uri with xmlFreeURI() */ - } + /* Strip square bracket from an IPv6 address. + * The function modifies the string in-place. Even after such + * modification, it is OK to free the URI with xmlFreeURI. */ + virStringStripIPv6Brackets(ret->server); if (virURIParseParams(ret) < 0) goto error; diff --git a/tests/virstringtest.c b/tests/virstringtest.c index 10fad2c880..841531f0bd 100644 --- a/tests/virstringtest.c +++ b/tests/virstringtest.c @@ -522,6 +522,36 @@ testVirStringFreeListCount(const void *opaque ATTRIBUTE_UNUSED) } +struct testStripIPv6BracketsData { + const char *string; + const char *result; +}; + +static int testStripIPv6Brackets(const void *args) +{ + const struct testStripIPv6BracketsData *data = args; + int ret = -1; + char *res = NULL; + + if (VIR_STRDUP(res, data->string) < 0) + goto cleanup; + + virStringStripIPv6Brackets(res); + + if (STRNEQ_NULLABLE(res, data->result)) { + fprintf(stderr, "Returned '%s', expected '%s'\n", + NULLSTR(res), NULLSTR(data->result)); + goto cleanup; + } + + ret = 0; + + cleanup: + VIR_FREE(res); + return ret; +} + + static int mymain(void) { @@ -731,6 +761,25 @@ mymain(void) NULL) < 0) ret = -1; +#define TEST_STRIP_IPV6_BRACKETS(str, res) \ + do { \ + struct testStripIPv6BracketsData stripData = { \ + .string = str, \ + .result = res, \ + }; \ + if (virtTestRun("Strip brackets from IPv6 " #str, \ + testStripIPv6Brackets, &stripData) < 0) \ + ret = -1; \ + } while (0) + + TEST_STRIP_IPV6_BRACKETS(NULL, NULL); + TEST_STRIP_IPV6_BRACKETS("[]", "[]"); + TEST_STRIP_IPV6_BRACKETS("[:]", ":"); + TEST_STRIP_IPV6_BRACKETS("[::1]", "::1"); + TEST_STRIP_IPV6_BRACKETS("[hello:", "[hello:"); + TEST_STRIP_IPV6_BRACKETS(":hello]", ":hello]"); + TEST_STRIP_IPV6_BRACKETS(":[]:", ":[]:"); + return ret == 0 ? EXIT_SUCCESS : EXIT_FAILURE; }