mirror of
				https://gitlab.freedesktop.org/pulseaudio/pulseaudio.git
				synced 2025-11-03 09:01:50 -05:00 
			
		
		
		
	Support IPv6 address in pa_socket_client_new_string()
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 Reviewed-by: Anton Lundin <glance@acc.umu.se>
This commit is contained in:
		
							parent
							
								
									84952e6a09
								
							
						
					
					
						commit
						017ed3e7fa
					
				
					 3 changed files with 32 additions and 2 deletions
				
			
		| 
						 | 
				
			
			@ -143,3 +143,14 @@ bool pa_is_ip_address(const char *a) {
 | 
			
		|||
 | 
			
		||||
    return false;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
bool pa_is_ip6_address(const char *a) {
 | 
			
		||||
    char buf[INET6_ADDRSTRLEN];
 | 
			
		||||
 | 
			
		||||
    pa_assert(a);
 | 
			
		||||
 | 
			
		||||
    if (inet_pton(AF_INET6, a, buf) >= 1)
 | 
			
		||||
        return true;
 | 
			
		||||
 | 
			
		||||
    return false;
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -41,4 +41,6 @@ int pa_parse_address(const char *a, pa_parsed_address *ret_p);
 | 
			
		|||
 | 
			
		||||
bool pa_is_ip_address(const char *a);
 | 
			
		||||
 | 
			
		||||
bool pa_is_ip6_address(const char *a);
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -428,12 +428,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;
 | 
			
		||||
| 
						 | 
				
			
			@ -530,6 +546,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;
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue