From ae7cf71dcf17aa7e309c62b69fed5a321c4ca5c9 Mon Sep 17 00:00:00 2001 From: "Roger A. Light" Date: Wed, 7 Jan 2026 15:04:06 +0000 Subject: [PATCH] Fix errno setting on Windows Closes #3424 --- lib/http_client.c | 2 +- lib/mosquitto_internal.h | 5 +++++ lib/packet_mosq.c | 7 +++---- lib/socks_mosq.c | 3 +-- 4 files changed, 10 insertions(+), 7 deletions(-) diff --git a/lib/http_client.c b/lib/http_client.c index c8dafe72..e7cf4c1a 100644 --- a/lib/http_client.c +++ b/lib/http_client.c @@ -131,7 +131,7 @@ int http_c__read(struct mosquitto *mosq) if(read_length == 0){ return MOSQ_ERR_CONN_LOST; /* EOF */ } - WINDOWS_SET_ERRNO(); + WINDOWS_SET_ERRNO_RW(); if(errno == EAGAIN || errno == COMPAT_EWOULDBLOCK){ return MOSQ_ERR_SUCCESS; }else{ diff --git a/lib/mosquitto_internal.h b/lib/mosquitto_internal.h index 3ec9df7f..0beaec31 100644 --- a/lib/mosquitto_internal.h +++ b/lib/mosquitto_internal.h @@ -77,11 +77,16 @@ typedef int mosq_sock_t; #ifdef WIN32 # define WINDOWS_SET_ERRNO() \ + do{ \ + errno = WSAGetLastError(); \ + }while(0) +# define WINDOWS_SET_ERRNO_RW() \ if(errno != EAGAIN){ \ errno = WSAGetLastError(); \ } #else # define WINDOWS_SET_ERRNO() +# define WINDOWS_SET_ERRNO_RW() #endif #define SAFE_PRINT(A) (A)?(A):"null" diff --git a/lib/packet_mosq.c b/lib/packet_mosq.c index c1587cc9..6adee2bb 100644 --- a/lib/packet_mosq.c +++ b/lib/packet_mosq.c @@ -307,8 +307,7 @@ int packet__write(struct mosquitto *mosq) packet->to_process -= (uint32_t)write_length; packet->pos += (uint32_t)write_length; }else{ - WINDOWS_SET_ERRNO(); - + WINDOWS_SET_ERRNO_RW(); if(errno == EAGAIN || errno == COMPAT_EWOULDBLOCK #ifdef WIN32 || errno == WSAENOTCONN @@ -377,7 +376,7 @@ static int read_header(struct mosquitto *mosq, ssize_t (*func_read)(struct mosqu if(read_length == 0){ return MOSQ_ERR_CONN_LOST; /* EOF */ } - WINDOWS_SET_ERRNO(); + WINDOWS_SET_ERRNO_RW(); if(errno == EAGAIN || errno == COMPAT_EWOULDBLOCK){ return MOSQ_ERR_SUCCESS; }else{ @@ -586,7 +585,7 @@ static int packet__read_single(struct mosquitto *mosq, enum mosquitto_client_sta mosq->in_packet.to_process -= (uint32_t)read_length; mosq->in_packet.pos += (uint32_t)read_length; }else{ - WINDOWS_SET_ERRNO(); + WINDOWS_SET_ERRNO_RW(); if(errno == EAGAIN || errno == COMPAT_EWOULDBLOCK){ if(mosq->in_packet.to_process > 1000){ /* Update last_msg_in time if more than 1000 bytes left to diff --git a/lib/socks_mosq.c b/lib/socks_mosq.c index 53ced849..759433cf 100644 --- a/lib/socks_mosq.c +++ b/lib/socks_mosq.c @@ -64,8 +64,7 @@ Contributors: static inline int socks5__network_error(struct mosquitto *mosq) { - WINDOWS_SET_ERRNO(); - + WINDOWS_SET_ERRNO_RW(); if(errno == EAGAIN || errno == COMPAT_EWOULDBLOCK){ return MOSQ_ERR_SUCCESS; }else{