IpV6 link local addresses resolve but don't connect
Opened this issue · 2 comments
Describe the bug
ipv6 link local style addresses don't work.
paho.mqtt.c successfully resolves addresses of the form
tcp://[xxxx::xxxx:xxxx:xxxx%eth0]:1883
But when it comes to connect, the complete results from getaddrinfo
are not copied over into the addrinfo
, as per line 1130 of Socket.c
:
if (res->ai_family == AF_INET6)
{
address6.sin6_port = htons(port);
address6.sin6_family = family = AF_INET6;
memcpy(&address6.sin6_addr, &((struct sockaddr_in6*)(res->ai_addr))->sin6_addr, sizeof(address6.sin6_addr));
This only copies over the address, but not the sin6_scope_id
and sin6_flowinfo
, so the complete link local address cannot connect.
Adding these two lines (or cleaner variant thereof) led to success for me:
memcpy(&address6.sin6_scope_id, &((struct sockaddr_in6*)(res->ai_addr))->sin6_scope_id, sizeof(address6.sin6_scope_id));
memcpy(&address6.sin6_flowinfo, &((struct sockaddr_in6*)(res->ai_addr))->sin6_flowinfo, sizeof(address6.sin6_flowinfo));
}
To Reproduce
Attempt to connect to an ipv6 link local address to a mqtt broker. It will fail at connect time. Adding the two lines listed above makes it succeed.
Expected behavior
Paho should be able to connect to a broker using such an address.
** Environment (please complete the following information):**
- Linux
- paho.mqtt.c checked out @ commit hash 6b1e202
Fix at master...rdaum:paho.mqtt.c:master
I'd create a PR, but I'm not going to go register and sign the Eclipse contributors agreement just for this. Please apply it yourselves.