[Spice-devel] [PATCH spice-gtk v3 7/7] spice-uri: Add ipv6 support
Victor Toso
lists at victortoso.com
Fri May 20 08:54:45 UTC 2016
Hi,
On Thu, May 19, 2016 at 06:38:09PM +0200, Pavel Grunt wrote:
> Just basic support - http://user:password@[host]:port
>
> Resolves: rhbz#1335239
> ---
> src/spice-uri.c | 25 +++++++++++++++++++++----
> tests/test-spice-uri.c | 42 ++++++++++++++++++++++++++++++++++++++++++
> 2 files changed, 63 insertions(+), 4 deletions(-)
>
> diff --git a/src/spice-uri.c b/src/spice-uri.c
> index 6a43461..323fbf7 100644
> --- a/src/spice-uri.c
> +++ b/src/spice-uri.c
> @@ -150,10 +150,29 @@ gboolean spice_uri_parse(SpiceURI *self, const gchar *_uri, GError **error)
> uri = next;
> }
>
> - /* max 2 parts, host:port */
> - gchar **uriv = g_strsplit(uri, ":", 2);
> + gchar **uriv;
> const gchar *uri_port = NULL;
>
> + if (*uri == '[') { /* ipv6 address */
> + uriv = g_strsplit(uri + 1, "]", 2);
> + if (uriv[1] == NULL) {
> + g_set_error(error, SPICE_CLIENT_ERROR, SPICE_CLIENT_ERROR_FAILED,
> + "Missing ']' in ipv6 uri");
> + goto end;
> + }
> + if (*uriv[1] == ':') {
> + uri_port = uriv[1] + 1;
> + } else if (strlen(uriv[1]) > 0) { /* invalid string after the hostname */
> + g_set_error(error, SPICE_CLIENT_ERROR, SPICE_CLIENT_ERROR_FAILED,
> + "Invalid uri address");
> + goto end;
> + }
> + } else {
> + /* max 2 parts, host:port */
> + uriv = g_strsplit(uri, ":", 2);
> + uri_port = uriv[1];
> + }
> +
This seems to leak (I think Frediano said it before)
Full valgrind in the end.
> if (uriv[0] == NULL || strlen(uriv[0]) == 0) {
> g_set_error(error, SPICE_CLIENT_ERROR, SPICE_CLIENT_ERROR_FAILED,
> "Invalid hostname in uri address");
> @@ -161,8 +180,6 @@ gboolean spice_uri_parse(SpiceURI *self, const gchar *_uri, GError **error)
> }
>
> spice_uri_set_hostname(self, uriv[0]);
> - if (uriv[0] != NULL)
> - uri_port = uriv[1];
>
> if (uri_port != NULL) {
> gchar *endptr;
> diff --git a/tests/test-spice-uri.c b/tests/test-spice-uri.c
> index c32a343..9cdcb90 100644
> --- a/tests/test-spice-uri.c
> +++ b/tests/test-spice-uri.c
> @@ -66,11 +66,53 @@ static void test_spice_uri_ipv4(void)
> g_object_unref(uri);
> }
>
> +static void test_spice_uri_ipv6(void)
> +{
> + const struct test_case invalid_test_cases[] = {
> + {"http://[]:80", "http", NULL, 80, NULL, NULL},
> + {"http://[::1", "http", NULL, 3128, NULL, NULL},
> + {"http://[host]1234", "http", "host", 3128, NULL, NULL},
> + {"http://[host]foo/", "http", "host", 3128, NULL, NULL},
> + {"http://[::1]:port", "http", "::1", 3128, NULL, NULL},
> + {"http://[::127.0.0.1]:", "http", "::127.0.0.1", 3128, NULL, NULL},
> + {"http://[::127.0.0.1]:-42", "http", "::127.0.0.1", 3128, NULL, NULL},
> + {"[3ffe:2a00:100:7031::1]:42000000", "http", "3ffe:2a00:100:7031::1", 3128, NULL, NULL},
> + };
> + const struct test_case valid_test_cases[] = {
> + {"http://user:password@[host]:80/", "http", "host", 80, "user", "password"},
> + {"http://user@[1080:0:0:0:8:800:200C:4171]:100", "http", "1080:0:0:0:8:800:200C:4171", 100,
> + "user", NULL},
> + {"https://[1080::8:800:200C:417A]", "https", "1080::8:800:200C:417A", 3129, NULL, NULL},
> + {"[3ffe:2a00:100:7031::1]", "http", "3ffe:2a00:100:7031::1", 3128, NULL, NULL},
> + };
> +
> + guint i;
> +
> + SpiceURI *uri = spice_uri_new();
> + g_assert_nonnull(uri);
> +
> + for (i = 0; i < G_N_ELEMENTS(invalid_test_cases); i++) {
> + g_assert_false(spice_uri_parse(uri, invalid_test_cases[i].uri, NULL));
> + }
> +
> + for (i = 0; i < G_N_ELEMENTS(valid_test_cases); i++) {
> + g_assert_true(spice_uri_parse(uri, valid_test_cases[i].uri, NULL));
> + g_assert_cmpstr(spice_uri_get_scheme(uri), ==, valid_test_cases[i].scheme);
> + g_assert_cmpstr(spice_uri_get_hostname(uri), ==, valid_test_cases[i].hostname);
> + g_assert_cmpstr(spice_uri_get_user(uri), ==, valid_test_cases[i].user);
> + g_assert_cmpstr(spice_uri_get_password(uri), ==, valid_test_cases[i].password);
> + g_assert_cmpuint(spice_uri_get_port(uri), ==, valid_test_cases[i].port);
> + }
> +
> + g_object_unref(uri);
> +}
> +
> int main(int argc, char* argv[])
> {
> g_test_init(&argc, &argv, NULL);
>
> g_test_add_func("/spice_uri/ipv4", test_spice_uri_ipv4);
> + g_test_add_func("/spice_uri/ipv6", test_spice_uri_ipv6);
>
> return g_test_run();
> }
Yeah, I would split the tests with good-uri (should work) and bad-uri
(should fail)
/spice-uri/ipv4/good-uri
/spice-uri/ipv6/good-uri
/spice-uri/ipv4/bad-uri
/spice-uri/ipv6/bad-uri
Cheers,
toso
> --
> 2.8.2
>
> _______________________________________________
> Spice-devel mailing list
> Spice-devel at lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/spice-devel
/spice_uri/ipv6: OK
==15632==
==15632== HEAP SUMMARY:
==15632== in use at exit: 56,764 bytes in 331 blocks
==15632== total heap usage: 604 allocs, 273 frees, 228,456 bytes
allocated
==15632==
==15632== 5 bytes in 1 blocks are definitely lost in loss record 6 of
301
==15632== at 0x4C28BF6: malloc (vg_replace_malloc.c:299)
==15632== by 0x91F9278: g_malloc (gmem.c:94)
==15632== by 0x9211AEE: g_strdup (gstrfuncs.c:363)
==15632== by 0x402490: spice_uri_set_user (spice-uri.c:488)
==15632== by 0x402AFA: spice_uri_parse (spice-uri.c:148)
==15632== by 0x401985: test_spice_uri_ipv4 (test-spice-uri.c:58)
==15632== by 0x9218ADA: test_case_run (gtestutils.c:2158)
==15632== by 0x9218ADA: g_test_run_suite_internal (gtestutils.c:2241)
==15632== by 0x9218CA2: g_test_run_suite_internal (gtestutils.c:2253)
==15632== by 0x9218E9D: g_test_run_suite (gtestutils.c:2328)
==15632== by 0x9218EC0: g_test_run (gtestutils.c:1596)
==15632== by 0x4014EF: main (test-spice-uri.c:117)
==15632==
==15632== 5 bytes in 1 blocks are definitely lost in loss record 7 of
301
==15632== at 0x4C28BF6: malloc (vg_replace_malloc.c:299)
==15632== by 0x91F9278: g_malloc (gmem.c:94)
==15632== by 0x9211AEE: g_strdup (gstrfuncs.c:363)
==15632== by 0x402020: spice_uri_set_scheme (spice-uri.c:238)
==15632== by 0x402CEF: spice_uri_parse (spice-uri.c:129)
==15632== by 0x401665: test_spice_uri_ipv6 (test-spice-uri.c:95)
==15632== by 0x9218ADA: test_case_run (gtestutils.c:2158)
==15632== by 0x9218ADA: g_test_run_suite_internal (gtestutils.c:2241)
==15632== by 0x9218CA2: g_test_run_suite_internal (gtestutils.c:2253)
==15632== by 0x9218E9D: g_test_run_suite (gtestutils.c:2328)
==15632== by 0x9218EC0: g_test_run (gtestutils.c:1596)
==15632== by 0x4014EF: main (test-spice-uri.c:117)
==15632==
==15632== 6 bytes in 1 blocks are definitely lost in loss record 8 of
301
==15632== at 0x4C28BF6: malloc (vg_replace_malloc.c:299)
==15632== by 0x91F9278: g_malloc (gmem.c:94)
==15632== by 0x9211AEE: g_strdup (gstrfuncs.c:363)
==15632== by 0x402020: spice_uri_set_scheme (spice-uri.c:238)
==15632== by 0x4029FC: spice_uri_parse (spice-uri.c:126)
==15632== by 0x401985: test_spice_uri_ipv4 (test-spice-uri.c:58)
==15632== by 0x9218ADA: test_case_run (gtestutils.c:2158)
==15632== by 0x9218ADA: g_test_run_suite_internal (gtestutils.c:2241)
==15632== by 0x9218CA2: g_test_run_suite_internal (gtestutils.c:2253)
==15632== by 0x9218E9D: g_test_run_suite (gtestutils.c:2328)
==15632== by 0x9218EC0: g_test_run (gtestutils.c:1596)
==15632== by 0x4014EF: main (test-spice-uri.c:117)
==15632==
==15632== 6 bytes in 1 blocks are definitely lost in loss record 9 of
301
==15632== at 0x4C28BF6: malloc (vg_replace_malloc.c:299)
==15632== by 0x91F9278: g_malloc (gmem.c:94)
==15632== by 0x9211AEE: g_strdup (gstrfuncs.c:363)
==15632== by 0x402020: spice_uri_set_scheme (spice-uri.c:238)
==15632== by 0x4029FC: spice_uri_parse (spice-uri.c:126)
==15632== by 0x4016A5: test_spice_uri_ipv6 (test-spice-uri.c:99)
==15632== by 0x9218ADA: test_case_run (gtestutils.c:2158)
==15632== by 0x9218ADA: g_test_run_suite_internal (gtestutils.c:2241)
==15632== by 0x9218CA2: g_test_run_suite_internal (gtestutils.c:2253)
==15632== by 0x9218E9D: g_test_run_suite (gtestutils.c:2328)
==15632== by 0x9218EC0: g_test_run (gtestutils.c:1596)
==15632== by 0x4014EF: main (test-spice-uri.c:117)
==15632==
==15632== 9 bytes in 1 blocks are definitely lost in loss record 17 of
301
==15632== at 0x4C28BF6: malloc (vg_replace_malloc.c:299)
==15632== by 0x91F9278: g_malloc (gmem.c:94)
==15632== by 0x9211AEE: g_strdup (gstrfuncs.c:363)
==15632== by 0x402740: spice_uri_set_password (spice-uri.c:520)
==15632== by 0x402B05: spice_uri_parse (spice-uri.c:149)
==15632== by 0x401985: test_spice_uri_ipv4 (test-spice-uri.c:58)
==15632== by 0x9218ADA: test_case_run (gtestutils.c:2158)
==15632== by 0x9218ADA: g_test_run_suite_internal (gtestutils.c:2241)
==15632== by 0x9218CA2: g_test_run_suite_internal (gtestutils.c:2253)
==15632== by 0x9218E9D: g_test_run_suite (gtestutils.c:2328)
==15632== by 0x9218EC0: g_test_run (gtestutils.c:1596)
==15632== by 0x4014EF: main (test-spice-uri.c:117)
==15632==
==15632== 9 bytes in 1 blocks are definitely lost in loss record 18 of
301
==15632== at 0x4C28BF6: malloc (vg_replace_malloc.c:299)
==15632== by 0x91F9278: g_malloc (gmem.c:94)
==15632== by 0x9211AEE: g_strdup (gstrfuncs.c:363)
==15632== by 0x402740: spice_uri_set_password (spice-uri.c:520)
==15632== by 0x402B05: spice_uri_parse (spice-uri.c:149)
==15632== by 0x4016A5: test_spice_uri_ipv6 (test-spice-uri.c:99)
==15632== by 0x9218ADA: test_case_run (gtestutils.c:2158)
==15632== by 0x9218ADA: g_test_run_suite_internal (gtestutils.c:2241)
==15632== by 0x9218CA2: g_test_run_suite_internal (gtestutils.c:2253)
==15632== by 0x9218E9D: g_test_run_suite (gtestutils.c:2328)
==15632== by 0x9218EC0: g_test_run (gtestutils.c:1596)
==15632== by 0x4014EF: main (test-spice-uri.c:117)
==15632==
==15632== 10 bytes in 2 blocks are definitely lost in loss record 20 of
301
==15632== at 0x4C28BF6: malloc (vg_replace_malloc.c:299)
==15632== by 0x91F9278: g_malloc (gmem.c:94)
==15632== by 0x9211AEE: g_strdup (gstrfuncs.c:363)
==15632== by 0x402020: spice_uri_set_scheme (spice-uri.c:238)
==15632== by 0x402BA0: spice_uri_parse (spice-uri.c:122)
==15632== by 0x401985: test_spice_uri_ipv4 (test-spice-uri.c:58)
==15632== by 0x9218ADA: test_case_run (gtestutils.c:2158)
==15632== by 0x9218ADA: g_test_run_suite_internal (gtestutils.c:2241)
==15632== by 0x9218CA2: g_test_run_suite_internal (gtestutils.c:2253)
==15632== by 0x9218E9D: g_test_run_suite (gtestutils.c:2328)
==15632== by 0x9218EC0: g_test_run (gtestutils.c:1596)
==15632== by 0x4014EF: main (test-spice-uri.c:117)
==15632==
==15632== 10 bytes in 2 blocks are definitely lost in loss record 21 of
301
==15632== at 0x4C28BF6: malloc (vg_replace_malloc.c:299)
==15632== by 0x91F9278: g_malloc (gmem.c:94)
==15632== by 0x9211AEE: g_strdup (gstrfuncs.c:363)
==15632== by 0x402020: spice_uri_set_scheme (spice-uri.c:238)
==15632== by 0x402BA0: spice_uri_parse (spice-uri.c:122)
==15632== by 0x4016A5: test_spice_uri_ipv6 (test-spice-uri.c:99)
==15632== by 0x9218ADA: test_case_run (gtestutils.c:2158)
==15632== by 0x9218ADA: g_test_run_suite_internal (gtestutils.c:2241)
==15632== by 0x9218CA2: g_test_run_suite_internal (gtestutils.c:2253)
==15632== by 0x9218E9D: g_test_run_suite (gtestutils.c:2328)
==15632== by 0x9218EC0: g_test_run (gtestutils.c:1596)
==15632== by 0x4014EF: main (test-spice-uri.c:117)
==15632==
==15632== 10 bytes in 2 blocks are definitely lost in loss record 22 of
301
==15632== at 0x4C28BF6: malloc (vg_replace_malloc.c:299)
==15632== by 0x91F9278: g_malloc (gmem.c:94)
==15632== by 0x9211AEE: g_strdup (gstrfuncs.c:363)
==15632== by 0x402490: spice_uri_set_user (spice-uri.c:488)
==15632== by 0x402AFA: spice_uri_parse (spice-uri.c:148)
==15632== by 0x4016A5: test_spice_uri_ipv6 (test-spice-uri.c:99)
==15632== by 0x9218ADA: test_case_run (gtestutils.c:2158)
==15632== by 0x9218ADA: g_test_run_suite_internal (gtestutils.c:2241)
==15632== by 0x9218CA2: g_test_run_suite_internal (gtestutils.c:2253)
==15632== by 0x9218E9D: g_test_run_suite (gtestutils.c:2328)
==15632== by 0x9218EC0: g_test_run (gtestutils.c:1596)
==15632== by 0x4014EF: main (test-spice-uri.c:117)
==15632==
==15632== 25 bytes in 3 blocks are definitely lost in loss record 128 of
301
==15632== at 0x4C28BF6: malloc (vg_replace_malloc.c:299)
==15632== by 0x91F9278: g_malloc (gmem.c:94)
==15632== by 0x9211AEE: g_strdup (gstrfuncs.c:363)
==15632== by 0x402150: spice_uri_set_hostname (spice-uri.c:271)
==15632== by 0x402C7C: spice_uri_parse (spice-uri.c:182)
==15632== by 0x401985: test_spice_uri_ipv4 (test-spice-uri.c:58)
==15632== by 0x9218ADA: test_case_run (gtestutils.c:2158)
==15632== by 0x9218ADA: g_test_run_suite_internal (gtestutils.c:2241)
==15632== by 0x9218CA2: g_test_run_suite_internal (gtestutils.c:2253)
==15632== by 0x9218E9D: g_test_run_suite (gtestutils.c:2328)
==15632== by 0x9218EC0: g_test_run (gtestutils.c:1596)
==15632== by 0x4014EF: main (test-spice-uri.c:117)
==15632==
==15632== 30 bytes in 6 blocks are definitely lost in loss record 129 of
301
==15632== at 0x4C28BF6: malloc (vg_replace_malloc.c:299)
==15632== by 0x91F9278: g_malloc (gmem.c:94)
==15632== by 0x9211AEE: g_strdup (gstrfuncs.c:363)
==15632== by 0x402020: spice_uri_set_scheme (spice-uri.c:238)
==15632== by 0x402BA0: spice_uri_parse (spice-uri.c:122)
==15632== by 0x401945: test_spice_uri_ipv4 (test-spice-uri.c:54)
==15632== by 0x9218ADA: test_case_run (gtestutils.c:2158)
==15632== by 0x9218ADA: g_test_run_suite_internal (gtestutils.c:2241)
==15632== by 0x9218CA2: g_test_run_suite_internal (gtestutils.c:2253)
==15632== by 0x9218E9D: g_test_run_suite (gtestutils.c:2328)
==15632== by 0x9218EC0: g_test_run (gtestutils.c:1596)
==15632== by 0x4014EF: main (test-spice-uri.c:117)
==15632==
==15632== 35 bytes in 7 blocks are definitely lost in loss record 140 of
301
==15632== at 0x4C28BF6: malloc (vg_replace_malloc.c:299)
==15632== by 0x91F9278: g_malloc (gmem.c:94)
==15632== by 0x9211AEE: g_strdup (gstrfuncs.c:363)
==15632== by 0x402020: spice_uri_set_scheme (spice-uri.c:238)
==15632== by 0x402BA0: spice_uri_parse (spice-uri.c:122)
==15632== by 0x401665: test_spice_uri_ipv6 (test-spice-uri.c:95)
==15632== by 0x9218ADA: test_case_run (gtestutils.c:2158)
==15632== by 0x9218ADA: g_test_run_suite_internal (gtestutils.c:2241)
==15632== by 0x9218CA2: g_test_run_suite_internal (gtestutils.c:2253)
==15632== by 0x9218E9D: g_test_run_suite (gtestutils.c:2328)
==15632== by 0x9218EC0: g_test_run (gtestutils.c:1596)
==15632== by 0x4014EF: main (test-spice-uri.c:117)
==15632==
==15632== 40 bytes in 4 blocks are definitely lost in loss record 164 of
301
==15632== at 0x4C28BF6: malloc (vg_replace_malloc.c:299)
==15632== by 0x91F9278: g_malloc (gmem.c:94)
==15632== by 0x9211AEE: g_strdup (gstrfuncs.c:363)
==15632== by 0x402150: spice_uri_set_hostname (spice-uri.c:271)
==15632== by 0x402C7C: spice_uri_parse (spice-uri.c:182)
==15632== by 0x401945: test_spice_uri_ipv4 (test-spice-uri.c:54)
==15632== by 0x9218ADA: test_case_run (gtestutils.c:2158)
==15632== by 0x9218ADA: g_test_run_suite_internal (gtestutils.c:2241)
==15632== by 0x9218CA2: g_test_run_suite_internal (gtestutils.c:2253)
==15632== by 0x9218E9D: g_test_run_suite (gtestutils.c:2328)
==15632== by 0x9218EC0: g_test_run (gtestutils.c:1596)
==15632== by 0x4014EF: main (test-spice-uri.c:117)
==15632==
==15632== 50 bytes in 4 blocks are definitely lost in loss record 168 of
301
==15632== at 0x4C28BF6: malloc (vg_replace_malloc.c:299)
==15632== by 0x91F9278: g_malloc (gmem.c:94)
==15632== by 0x9211AEE: g_strdup (gstrfuncs.c:363)
==15632== by 0x402150: spice_uri_set_hostname (spice-uri.c:271)
==15632== by 0x402C7C: spice_uri_parse (spice-uri.c:182)
==15632== by 0x401665: test_spice_uri_ipv6 (test-spice-uri.c:95)
==15632== by 0x9218ADA: test_case_run (gtestutils.c:2158)
==15632== by 0x9218ADA: g_test_run_suite_internal (gtestutils.c:2241)
==15632== by 0x9218CA2: g_test_run_suite_internal (gtestutils.c:2253)
==15632== by 0x9218E9D: g_test_run_suite (gtestutils.c:2328)
==15632== by 0x9218EC0: g_test_run (gtestutils.c:1596)
==15632== by 0x4014EF: main (test-spice-uri.c:117)
==15632==
==15632== 54 bytes in 3 blocks are definitely lost in loss record 169 of
301
==15632== at 0x4C28BF6: malloc (vg_replace_malloc.c:299)
==15632== by 0x91F9278: g_malloc (gmem.c:94)
==15632== by 0x9211AEE: g_strdup (gstrfuncs.c:363)
==15632== by 0x402150: spice_uri_set_hostname (spice-uri.c:271)
==15632== by 0x402C7C: spice_uri_parse (spice-uri.c:182)
==15632== by 0x4016A5: test_spice_uri_ipv6 (test-spice-uri.c:99)
==15632== by 0x9218ADA: test_case_run (gtestutils.c:2158)
==15632== by 0x9218ADA: g_test_run_suite_internal (gtestutils.c:2241)
==15632== by 0x9218CA2: g_test_run_suite_internal (gtestutils.c:2253)
==15632== by 0x9218E9D: g_test_run_suite (gtestutils.c:2328)
==15632== by 0x9218EC0: g_test_run (gtestutils.c:1596)
==15632== by 0x4014EF: main (test-spice-uri.c:117)
==15632==
==15632== LEAK SUMMARY:
==15632== definitely lost: 304 bytes in 39 blocks
==15632== indirectly lost: 0 bytes in 0 blocks
==15632== possibly lost: 1,440 bytes in 20 blocks
==15632== still reachable: 54,156 bytes in 266 blocks
==15632== of which reachable via heuristic:
==15632== newarray : 1,536 bytes in 16
blocks
==15632== suppressed: 0 bytes in 0 blocks
==15632== Reachable blocks (those to which a pointer was found) are not
shown.
==15632== To see them, rerun with: --leak-check=full
--show-leak-kinds=all
==15632==
==15632== For counts of detected and suppressed errors, rerun with: -v
==15632== ERROR SUMMARY: 36 errors from 36 contexts (suppressed: 0 from
0)
More information about the Spice-devel
mailing list