[344] Fix leaks and incorrect connect call.
This commit is contained in:
parent
e13af18ed9
commit
e0e8cc9f3e
@ -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_step1(struct mosquitto *mosq, const char *host);
|
||||
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_socketpair(mosq_sock_t *sp1, mosq_sock_t *sp2);
|
||||
|
||||
|
16
src/bridge.c
16
src/bridge.c
@ -238,7 +238,21 @@ int mqtt3_bridge_connect_step2(struct mosquitto_db *db, struct mosquitto *contex
|
||||
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);
|
||||
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 == MOSQ_ERR_TLS){
|
||||
_mosquitto_socket_close(db, context);
|
||||
|
12
src/loop.c
12
src/loop.c
@ -250,6 +250,10 @@ int mosquitto_main_loop(struct mosquitto_db *db, mosq_sock_t *listensock, int li
|
||||
#ifdef __linux__
|
||||
if(context->adns){
|
||||
/* Waiting on DNS lookup */
|
||||
rc = gai_error(context->adns);
|
||||
if(rc == EAI_INPROGRESS){
|
||||
/* Just keep on waiting */
|
||||
}else if(rc == 0){
|
||||
rc = mqtt3_bridge_connect_step2(db, context);
|
||||
if(rc == MOSQ_ERR_SUCCESS){
|
||||
pollfds[pollfd_index].fd = context->sock;
|
||||
@ -266,6 +270,14 @@ int mosquitto_main_loop(struct mosquitto_db *db, mosq_sock_t *listensock, int li
|
||||
context->bridge->cur_address = 0;
|
||||
}
|
||||
}
|
||||
}else{
|
||||
/* Need to retry */
|
||||
if(context->adns->ar_result){
|
||||
freeaddrinfo(context->adns->ar_result);
|
||||
}
|
||||
_mosquitto_free(context->adns);
|
||||
context->adns = NULL;
|
||||
}
|
||||
}else{
|
||||
rc = mqtt3_bridge_connect_step1(db, context);
|
||||
if(rc){
|
||||
|
Loading…
Reference in New Issue
Block a user