Control: tag 813249 + upstream

[adding Marcelo Roberto Jimenez (i.e. upstream) to Cc]

Hello,

On 01/30/2016 11:05 PM, Uwe Kleine-König wrote:
> Package: libupnp6
> Version: 1:1.6.19+git20160116-1
> Severity: normal
> 
> Hello,
> 
> vlc stopped showing my dlna provider, when downgrading libupnp6 to
> 1:1.6.19+git20141001-1 it works fine again.
> 
> With libupnp6 1:1.6.19+git20141001-1 the (I think) relevant part obtained 
> from strace is:
> 
>       10317 socket(PF_INET, SOCK_STREAM, IPPROTO_IP) = 18
>       10317 socket(PF_INET6, SOCK_STREAM, IPPROTO_IP) = 19
>       10317 setsockopt(19, SOL_IPV6, IPV6_V6ONLY, [1], 4) = 0
>       10317 bind(18, {sa_family=AF_INET, sin_port=htons(49152), 
> sin_addr=inet_addr("0.0.0.0")}, 16) = 0
>       10317 bind(19, {sa_family=AF_INET6, sin6_port=htons(49152), 
> inet_pton(AF_INET6, "::", &sin6_addr), sin6_flowinfo=0, sin6_scope_id=0}, 28) 
> = 0
>       10317 listen(18, 128)                   = 0
>       10317 getsockname(18, {sa_family=AF_INET, sin_port=htons(49152), 
> sin_addr=inet_addr("0.0.0.0")}, [16]) = 0
>       10317 listen(19, 128)                   = 0
>       10317 getsockname(19, {sa_family=AF_INET6, sin6_port=htons(49152), 
> inet_pton(AF_INET6, "::", &sin6_addr), sin6_flowinfo=0, sin6_scope_id=0}, 
> [28]) = 0
> 
> while with 1:1.6.19+git20160116-1 I get:
> 
>       10997 socket(PF_INET, SOCK_STREAM, IPPROTO_IP) = 18
>       10997 socket(PF_INET6, SOCK_STREAM, IPPROTO_IP) = 19
>       10997 setsockopt(19, SOL_IPV6, IPV6_V6ONLY, [1], 4) = 0
>       10997 bind(18, {sa_family=AF_INET, sin_port=htons(49152), 
> sin_addr=inet_addr("192.168.77.157")}, 16) = 0
>       10997 bind(19, {sa_family=AF_INET6, sin6_port=htons(49152), 
> inet_pton(AF_INET6, "fe80::f2de:f1ff:fe44:529d", &sin6_addr), 
> sin6_flowinfo=0, sin6_scope_id=0}, 28) = -1 EINVAL (Invalid argument)
>       10997 bind(19, {sa_family=AF_INET6, sin6_port=htons(49153), 
> inet_pton(AF_INET6, "fe80::f2de:f1ff:fe44:529d", &sin6_addr), 
> sin6_flowinfo=0, sin6_scope_id=0}, 28) = -1 EINVAL (Invalid argument)
>       10997 bind(19, {sa_family=AF_INET6, sin6_port=htons(49154), 
> inet_pton(AF_INET6, "fe80::f2de:f1ff:fe44:529d", &sin6_addr), 
> sin6_flowinfo=0, sin6_scope_id=0}, 28) = -1 EINVAL (Invalid argument)
>       10997 bind(19, {sa_family=AF_INET6, sin6_port=htons(49155), 
> inet_pton(AF_INET6, "fe80::f2de:f1ff:fe44:529d", &sin6_addr), 
> sin6_flowinfo=0, sin6_scope_id=0}, 28) = -1 EINVAL (Invalid argument)
>       10997 bind(19, {sa_family=AF_INET6, sin6_port=htons(49156), 
> inet_pton(AF_INET6, "fe80::f2de:f1ff:fe44:529d", &sin6_addr), 
> sin6_flowinfo=0, sin6_scope_id=0}, 28) = -1 EINVAL (Invalid argument)
>       ...
>       10997 bind(19, {sa_family=AF_INET6, sin6_port=htons(65531), 
> inet_pton(AF_INET6, "fe80::f2de:f1ff:fe44:529d", &sin6_addr), 
> sin6_flowinfo=0, sin6_scope_id=0}, 28) = -1 EINVAL (Invalid argument)
>       10997 bind(19, {sa_family=AF_INET6, sin6_port=htons(65532), 
> inet_pton(AF_INET6, "fe80::f2de:f1ff:fe44:529d", &sin6_addr), 
> sin6_flowinfo=0, sin6_scope_id=0}, 28) = -1 EINVAL (Invalid argument)
>       10997 bind(19, {sa_family=AF_INET6, sin6_port=htons(65533), 
> inet_pton(AF_INET6, "fe80::f2de:f1ff:fe44:529d", &sin6_addr), 
> sin6_flowinfo=0, sin6_scope_id=0}, 28) = -1 EINVAL (Invalid argument)
>       10997 bind(19, {sa_family=AF_INET6, sin6_port=htons(65534), 
> inet_pton(AF_INET6, "fe80::f2de:f1ff:fe44:529d", &sin6_addr), 
> sin6_flowinfo=0, sin6_scope_id=0}, 28) = -1 EINVAL (Invalid argument)
>       10997 bind(19, {sa_family=AF_INET6, sin6_port=htons(65535), 
> inet_pton(AF_INET6, "fe80::f2de:f1ff:fe44:529d", &sin6_addr), 
> sin6_flowinfo=0, sin6_scope_id=0}, 28) = -1 EINVAL (Invalid argument)
>       10997 close(18)                         = 0
>       10997 close(19)                         = 0
> 
> The obvious difference is that the newer libupnp uses an explicit
> address for binding the port, but I don't see this as an excuse for bind
> to fail. And in fact the same difference exists for ipv4 where there
> doesn't seem to be a problem.
> 
> btw, netcat-openbsd has the same problem:
> 
>       nc fe80::2ac6:8eff:fe36:df57 22
> 
> fails with:
> 
>       connect(3, {sa_family=AF_INET6, sin6_port=htons(22), 
> inet_pton(AF_INET6, "fe80::2ac6:8eff:fe36:df57", &sin6_addr), 
> sin6_flowinfo=0, sin6_scope_id=0}, 28) = -1 EINVAL (Invalid argument)
> 
> while it works fine when using the ipv4 or a global ipv6 of the same
> machine.
> 
> So it seems to be a bad idea to use the link local ipv6. Without
> checking the source code, for machines with >1 network device using the
> wildcard address seems to be easier. Also it would be nice if libupnp
> fell back to ipv4 only if it fails to connect via ipv6.
> 
> Maybe this bug is a regression from addressing #781876?

No, it's not, it's a regression from

* Bind miniserver sockets to our given IP address not INADDR_ANY (patch 24).

that is upstream bug 127[1]. When reverting that one, vlc works as
expected (and before).

While searching for the problem I stumbled about the following paragraph
in ipv6(7):

ERRORS
       ENODEV The user tried to bind(2) to a link-local IPv6 address,
              but the sin6_scope_id in the supplied sockaddr_in6
              structure is not a valid interface index.

This doesn't match EINVAL that I'm seeing, but still is the problem I
think. libupnp (and also netcat) pass 0, which isn't a valid scope_id.
(The valid scope_ids can be determined from either $(ip link) or with
the SIOCGIFINDEX ioctl on a socket (see netdevice(7)). Not sure how
portable to non-Linux architectures that is though.

Best regards
Uwe

[1] https://sourceforge.net/p/pupnp/bugs/127/

Attachment: signature.asc
Description: OpenPGP digital signature

Reply via email to