Просмотр исходного кода

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.
Kazuki Yamaguchi 4 лет назад
Родитель
Сommit
fb7a037bc8
1 измененных файлов с 6 добавлено и 6 удалено
  1. 6 6
      plugins/obs-outputs/net-if.c

+ 6 - 6
plugins/obs-outputs/net-if.c

@@ -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