0
0
mirror of https://github.com/obsproject/obs-studio.git synced 2024-09-20 13:08:50 +02:00

obs-outputs: Fix binding to IPv6 addresses on *nix

Fix inet_ntop()/inet_pton() being called with an incorrect argument for
IPv6 addresses.

On Linux, the offset of the sin_addr and sin6_addr fields differ and
the confusion on the inet_ntop() call produces an erroneous IPv6 string
representation such as "0:0:2001:db8::". This is visible on the UI,
Settings -> Advanced -> Network -> Bind to IP.

The same goes for the inet_pton() call.
This commit is contained in:
Kazuki Yamaguchi 2021-08-14 13:59:35 +09:00 committed by Jim
parent 09b5290c7b
commit fb7a037bc8

View File

@ -60,7 +60,7 @@ static void netif_convert_to_string(char *dest,
temp_char, INET6_ADDRSTRLEN);
else if (family == AF_INET6)
inet_ntop(family,
&(((struct sockaddr_in *)byte_address)->sin_addr),
&(((struct sockaddr_in6 *)byte_address)->sin6_addr),
temp_char, INET6_ADDRSTRLEN);
#else
if (family == AF_INET)
@ -116,12 +116,12 @@ bool netif_str_to_addr(struct sockaddr_storage *out, int *addr_len,
warn("Could not parse address, error code: %d", GetLastError());
return ret != SOCKET_ERROR;
#else
struct sockaddr_in *sin = (struct sockaddr_in *)out;
if (inet_pton(out->ss_family, addr, &sin->sin_addr)) {
*addr_len = ipv6 ? sizeof(struct sockaddr_in6)
: sizeof(struct sockaddr_in);
*addr_len = ipv6 ? sizeof(struct sockaddr_in6)
: sizeof(struct sockaddr_in);
void *dst = ipv6 ? &((struct sockaddr_in6 *)out)->sin6_addr
: &((struct sockaddr_in *)out)->sin_addr;
if (inet_pton(out->ss_family, addr, dst))
return true;
}
return false;
#endif