A signal (except SIGUSR1) received while waiting for getaddrinfo() is considered fatal, so openvpn_getaddrinfo() is destroying the returned information with freeaddrinfo(), but still signalled "success" (0) to the caller - so if the caller accessed *res before checking *signal_received, it would access just-free()ed memory, which on some platforms still worked and on others caused a crash.
Also, ensure that *ai is also NULLed in the caller now. Signed-off-by: Gert Doering <g...@greenie.muc.de> --- src/openvpn/socket.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/openvpn/socket.c b/src/openvpn/socket.c index cf2dec3..034ccc1 100644 --- a/src/openvpn/socket.c +++ b/src/openvpn/socket.c @@ -219,10 +219,13 @@ msg(M_INFO, "if(*signal_received)"); } else { + /* turn success into failure (interrupted syscall) */ if (0 == status) { ASSERT(res); freeaddrinfo(*res); - res = NULL; + *res = NULL; + status = EAI_SYSTEM; + errno = EINTR; } goto done; } -- 2.4.0