From 238b68686a3cf66511aa147ec8980d88b367a3ac Mon Sep 17 00:00:00 2001 From: "Roger A. Light" Date: Tue, 8 Jun 2021 12:57:17 +0100 Subject: [PATCH] Fix bridge pollfd corruption on Windows. Closes #2173. Thanks to Niclas Lindgren. --- ChangeLog.txt | 2 ++ src/bridge.c | 8 ++++++++ 2 files changed, 10 insertions(+) diff --git a/ChangeLog.txt b/ChangeLog.txt index a705ca97..57d60df7 100644 --- a/ChangeLog.txt +++ b/ChangeLog.txt @@ -9,6 +9,8 @@ Broker: Closes #2207. - Improve QoS 0 outgoing packet queueing. - Fix non-reachable bridge blocking the broker on Windows. Closes #2172. +- Fix possible corruption of pollfd array on Windows when bridges were + reconnecting. Closes #2173. Clients: - If sending mosquitto_sub output to a pipe, mosquitto_sub will now detect diff --git a/src/bridge.c b/src/bridge.c index bb7b9c35..9ca367a9 100644 --- a/src/bridge.c +++ b/src/bridge.c @@ -245,6 +245,7 @@ int bridge__connect_step1(struct mosquitto *context) rc = net__try_connect_step1(context, context->bridge->addresses[context->bridge->cur_address].address); if(rc > 0 ){ if(rc == MOSQ_ERR_TLS){ + mux__delete(context); net__socket_close(context); return rc; /* Error already printed */ }else if(rc == MOSQ_ERR_ERRNO){ @@ -270,6 +271,7 @@ int bridge__connect_step2(struct mosquitto *context) rc = net__try_connect_step2(context, context->bridge->addresses[context->bridge->cur_address].port, &context->sock); if(rc > 0){ if(rc == MOSQ_ERR_TLS){ + mux__delete(context); net__socket_close(context); return rc; /* Error already printed */ }else if(rc == MOSQ_ERR_ERRNO){ @@ -298,6 +300,7 @@ int bridge__connect_step3(struct mosquitto *context) rc = net__socket_connect_step3(context, context->bridge->addresses[context->bridge->cur_address].address); if(rc > 0){ if(rc == MOSQ_ERR_TLS){ + mux__delete(context); net__socket_close(context); return rc; /* Error already printed */ }else if(rc == MOSQ_ERR_ERRNO){ @@ -326,6 +329,7 @@ int bridge__connect_step3(struct mosquitto *context) }else if(rc == MOSQ_ERR_EAI){ log__printf(NULL, MOSQ_LOG_ERR, "Error creating bridge: %s.", gai_strerror(errno)); } + mux__delete(context); net__socket_close(context); return rc; } @@ -437,6 +441,7 @@ int bridge__connect(struct mosquitto *context) if(rc > 0){ if(rc == MOSQ_ERR_TLS){ + mux__delete(context); net__socket_close(context); return rc; /* Error already printed */ }else if(rc == MOSQ_ERR_ERRNO){ @@ -466,6 +471,7 @@ int bridge__connect(struct mosquitto *context) }else if(rc2 == MOSQ_ERR_EAI){ log__printf(NULL, MOSQ_LOG_ERR, "Error creating bridge: %s.", gai_strerror(errno)); } + mux__delete(context); net__socket_close(context); return rc2; } @@ -751,6 +757,7 @@ void bridge_check(void) COMPAT_CLOSE(context->bridge->primary_retry_sock); context->bridge->primary_retry_sock = INVALID_SOCKET; context->bridge->primary_retry = 0; + mux__delete(context); net__socket_close(context); context->bridge->cur_address = 0; } @@ -761,6 +768,7 @@ void bridge_check(void) COMPAT_CLOSE(context->bridge->primary_retry_sock); context->bridge->primary_retry_sock = INVALID_SOCKET; context->bridge->primary_retry = 0; + mux__delete(context); net__socket_close(context); context->bridge->cur_address = context->bridge->address_count-1; }else{