[pulseaudio-discuss] [PATCH] Support IPv6 address in pa_socket_client_new_string()
Hajime Fujita
crisp.fujita at nifty.com
Sat Nov 8 21:59:22 PST 2014
pa_socket_client_new_string() did not work as expected when an IPv6
address string like "2001:db8::1" is passed as the "name" parameter.
This is because the name parameter is then passed to pa_parse_address(),
which thinks the last colon as a separator between hostname (or address)
and a port number. To prevent pa_parse_address() from doing this, an IPv6
address must be bracketed with "[]" (e.g. "[2001:db8::1]"). [1]
This patch fixes pa_socket_client_new_string() so that it internally
adds brackets to an IPv6 address. This decision is based on a
discussion at [2].
[1]: http://lists.freedesktop.org/archives/pulseaudio-discuss/2014-October/022010.html
[2]: http://lists.freedesktop.org/archives/pulseaudio-discuss/2014-November/022401.html
---
src/pulsecore/socket-client.c | 21 +++++++++++++++++++--
1 file changed, 19 insertions(+), 2 deletions(-)
diff --git a/src/pulsecore/socket-client.c b/src/pulsecore/socket-client.c
index 564a366..a784833 100644
--- a/src/pulsecore/socket-client.c
+++ b/src/pulsecore/socket-client.c
@@ -430,12 +430,28 @@ static void start_timeout(pa_socket_client *c, bool use_rtclock) {
pa_socket_client* pa_socket_client_new_string(pa_mainloop_api *m, bool use_rtclock, const char*name, uint16_t default_port) {
pa_socket_client *c = NULL;
pa_parsed_address a;
+ char *name_buf;
pa_assert(m);
pa_assert(name);
- if (pa_parse_address(name, &a) < 0)
- return NULL;
+ a.path_or_host = NULL;
+
+ if (pa_is_ip6_address(name)) {
+ size_t len = strlen(name);
+ name_buf = pa_xmalloc(len + 3);
+ memcpy(name_buf + 1, name, len);
+ name_buf[0] = '[';
+ name_buf[len + 1] = ']';
+ name_buf[len + 2] = '\0';
+ } else {
+ name_buf = pa_xstrdup(name);
+ }
+
+ if (pa_parse_address(name_buf, &a) < 0) {
+ pa_log_warn("parsing address failed: %s", name_buf);
+ goto finish;
+ }
if (!a.port)
a.port = default_port;
@@ -532,6 +548,7 @@ pa_socket_client* pa_socket_client_new_string(pa_mainloop_api *m, bool use_rtclo
}
finish:
+ pa_xfree(name_buf);
pa_xfree(a.path_or_host);
return c;
--
1.9.1
More information about the pulseaudio-discuss
mailing list