[344] Fix leaks and incorrect connect call.

This commit is contained in:
Roger A. Light 2017-02-06 23:10:43 +00:00
parent e13af18ed9
commit e0e8cc9f3e
3 changed files with 40 additions and 13 deletions

View File

@ -63,6 +63,7 @@ int _mosquitto_socket_close(struct mosquitto *mosq);
int _mosquitto_try_connect(struct mosquitto *mosq, const char *host, uint16_t port, mosq_sock_t *sock, const char *bind_address, bool blocking); int _mosquitto_try_connect(struct mosquitto *mosq, const char *host, uint16_t port, mosq_sock_t *sock, const char *bind_address, bool blocking);
int _mosquitto_try_connect_step1(struct mosquitto *mosq, const char *host); int _mosquitto_try_connect_step1(struct mosquitto *mosq, const char *host);
int _mosquitto_try_connect_step2(struct mosquitto *mosq, uint16_t port, mosq_sock_t *sock); int _mosquitto_try_connect_step2(struct mosquitto *mosq, uint16_t port, mosq_sock_t *sock);
int _mosquitto_socket_connect_step3(struct mosquitto *mosq, const char *host, uint16_t port, const char *bind_address, bool blocking);
int _mosquitto_socket_nonblock(mosq_sock_t sock); int _mosquitto_socket_nonblock(mosq_sock_t sock);
int _mosquitto_socketpair(mosq_sock_t *sp1, mosq_sock_t *sp2); int _mosquitto_socketpair(mosq_sock_t *sp1, mosq_sock_t *sp2);

View File

@ -238,7 +238,21 @@ int mqtt3_bridge_connect_step2(struct mosquitto_db *db, struct mosquitto *contex
if(!context || !context->bridge) return MOSQ_ERR_INVAL; if(!context || !context->bridge) return MOSQ_ERR_INVAL;
_mosquitto_log_printf(NULL, MOSQ_LOG_NOTICE, "Connecting bridge %s (%s:%d)", context->bridge->name, context->bridge->addresses[context->bridge->cur_address].address, context->bridge->addresses[context->bridge->cur_address].port); _mosquitto_log_printf(NULL, MOSQ_LOG_NOTICE, "Connecting bridge %s (%s:%d)", context->bridge->name, context->bridge->addresses[context->bridge->cur_address].address, context->bridge->addresses[context->bridge->cur_address].port);
rc = _mosquitto_socket_connect(context, context->bridge->addresses[context->bridge->cur_address].address, context->bridge->addresses[context->bridge->cur_address].port, NULL, false); rc = _mosquitto_try_connect_step2(context, context->bridge->addresses[context->bridge->cur_address].port, &context->sock);
if(rc > 0 ){
if(rc == MOSQ_ERR_TLS){
_mosquitto_socket_close(db, context);
return rc; /* Error already printed */
}else if(rc == MOSQ_ERR_ERRNO){
_mosquitto_log_printf(NULL, MOSQ_LOG_ERR, "Error creating bridge: %s.", strerror(errno));
}else if(rc == MOSQ_ERR_EAI){
_mosquitto_log_printf(NULL, MOSQ_LOG_ERR, "Error creating bridge: %s.", gai_strerror(errno));
}
return rc;
}
rc = _mosquitto_socket_connect_step3(context, context->bridge->addresses[context->bridge->cur_address].address, context->bridge->addresses[context->bridge->cur_address].port, NULL, false);
if(rc > 0 ){ if(rc > 0 ){
if(rc == MOSQ_ERR_TLS){ if(rc == MOSQ_ERR_TLS){
_mosquitto_socket_close(db, context); _mosquitto_socket_close(db, context);

View File

@ -250,21 +250,33 @@ int mosquitto_main_loop(struct mosquitto_db *db, mosq_sock_t *listensock, int li
#ifdef __linux__ #ifdef __linux__
if(context->adns){ if(context->adns){
/* Waiting on DNS lookup */ /* Waiting on DNS lookup */
rc = mqtt3_bridge_connect_step2(db, context); rc = gai_error(context->adns);
if(rc == MOSQ_ERR_SUCCESS){ if(rc == EAI_INPROGRESS){
pollfds[pollfd_index].fd = context->sock; /* Just keep on waiting */
pollfds[pollfd_index].events = POLLIN; }else if(rc == 0){
pollfds[pollfd_index].revents = 0; rc = mqtt3_bridge_connect_step2(db, context);
if(context->current_out_packet){ if(rc == MOSQ_ERR_SUCCESS){
pollfds[pollfd_index].events |= POLLOUT; pollfds[pollfd_index].fd = context->sock;
pollfds[pollfd_index].events = POLLIN;
pollfds[pollfd_index].revents = 0;
if(context->current_out_packet){
pollfds[pollfd_index].events |= POLLOUT;
}
context->pollfd_index = pollfd_index;
pollfd_index++;
}else{
context->bridge->cur_address++;
if(context->bridge->cur_address == context->bridge->address_count){
context->bridge->cur_address = 0;
}
} }
context->pollfd_index = pollfd_index;
pollfd_index++;
}else{ }else{
context->bridge->cur_address++; /* Need to retry */
if(context->bridge->cur_address == context->bridge->address_count){ if(context->adns->ar_result){
context->bridge->cur_address = 0; freeaddrinfo(context->adns->ar_result);
} }
_mosquitto_free(context->adns);
context->adns = NULL;
} }
}else{ }else{
rc = mqtt3_bridge_connect_step1(db, context); rc = mqtt3_bridge_connect_step1(db, context);