Merge branch 'fix_interface_binding' of git://github.com/mosterdt/mosquitto into mosterdt-fix_interface_binding

pull/2166/head
Roger A. Light 5 years ago
commit 8a5de787a7

@ -624,13 +624,26 @@ static int net__bind_interface(struct mosquitto__listener *listener, struct addr
&& ifa->ifa_addr->sa_family == rp->ai_addr->sa_family){ && ifa->ifa_addr->sa_family == rp->ai_addr->sa_family){
if(rp->ai_addr->sa_family == AF_INET){ if(rp->ai_addr->sa_family == AF_INET){
if(listener->host &&
memcmp(&((struct sockaddr_in *)rp->ai_addr)->sin_addr,
&((struct sockaddr_in *)ifa->ifa_addr)->sin_addr,
sizeof(struct in_addr))){
log__printf(NULL, MOSQ_LOG_WARNING, "Warning: Interface address does not match specified listener host.");
}else{
memcpy(&((struct sockaddr_in *)rp->ai_addr)->sin_addr, memcpy(&((struct sockaddr_in *)rp->ai_addr)->sin_addr,
&((struct sockaddr_in *)ifa->ifa_addr)->sin_addr, &((struct sockaddr_in *)ifa->ifa_addr)->sin_addr,
sizeof(struct in_addr)); sizeof(struct in_addr));
freeifaddrs(ifaddr); freeifaddrs(ifaddr);
return MOSQ_ERR_SUCCESS; return MOSQ_ERR_SUCCESS;
}
}else if(rp->ai_addr->sa_family == AF_INET6){ }else if(rp->ai_addr->sa_family == AF_INET6){
if(listener->host &&
memcmp(&((struct sockaddr_in6 *)rp->ai_addr)->sin6_addr,
&((struct sockaddr_in6 *)ifa->ifa_addr)->sin6_addr,
sizeof(struct in6_addr))){
log__printf(NULL, MOSQ_LOG_WARNING, "Warning: Interface address does not match specified listener host.");
}else{
memcpy(&((struct sockaddr_in6 *)rp->ai_addr)->sin6_addr, memcpy(&((struct sockaddr_in6 *)rp->ai_addr)->sin6_addr,
&((struct sockaddr_in6 *)ifa->ifa_addr)->sin6_addr, &((struct sockaddr_in6 *)ifa->ifa_addr)->sin6_addr,
sizeof(struct in6_addr)); sizeof(struct in6_addr));
@ -639,8 +652,10 @@ static int net__bind_interface(struct mosquitto__listener *listener, struct addr
} }
} }
} }
}
freeifaddrs(ifaddr); freeifaddrs(ifaddr);
log__printf(NULL, MOSQ_LOG_ERR, "Error: Interface %s not found.", listener->bind_interface); log__printf(NULL, MOSQ_LOG_WARNING, "Warning: Interface %s does not support %s configuration.",
listener->bind_interface, rp->ai_addr->sa_family == AF_INET ? "ipv4" : "ipv6");
return MOSQ_ERR_NOT_FOUND; return MOSQ_ERR_NOT_FOUND;
} }
#endif #endif
@ -654,6 +669,9 @@ static int net__socket_listen_tcp(struct mosquitto__listener *listener)
char service[10]; char service[10];
int rc; int rc;
int ss_opt = 1; int ss_opt = 1;
#ifndef WIN32
bool interface_bound = false;
#endif
if(!listener) return MOSQ_ERR_INVAL; if(!listener) return MOSQ_ERR_INVAL;
@ -718,12 +736,14 @@ static int net__socket_listen_tcp(struct mosquitto__listener *listener)
#ifndef WIN32 #ifndef WIN32
if(listener->bind_interface){ if(listener->bind_interface){
/* It might be possible that an interface does not support all relevant sa_families.
* We should successfully find at least one. */
if(net__bind_interface(listener, rp)){ if(net__bind_interface(listener, rp)){
COMPAT_CLOSE(sock); COMPAT_CLOSE(sock);
freeaddrinfo(ainfo); listener->sock_count--;
mosquitto__free(listener->socks); continue;
return 1;
} }
interface_bound = true;
} }
#endif #endif
@ -745,6 +765,13 @@ static int net__socket_listen_tcp(struct mosquitto__listener *listener)
} }
freeaddrinfo(ainfo); freeaddrinfo(ainfo);
#ifndef WIN32
if(listener->bind_interface && !interface_bound){
mosquitto__free(listener->socks);
return 1;
}
#endif
return 0; return 0;
} }

Loading…
Cancel
Save