summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGert Doering <gert@greenie.muc.de>2015-05-31 22:41:58 +0200
committerGert Doering <gert@greenie.muc.de>2015-06-01 16:52:19 +0200
commit5f6c01ea6172ed1d8ed04e31f9f6c3f8e4696109 (patch)
tree511bf587541717cd22da108472338cde4cf04f34
parent7d30696ac51aa9649f2290ada2c0fb5865cfe859 (diff)
downloadopenvpn-5f6c01ea6172ed1d8ed04e31f9f6c3f8e4696109.tar.gz
openvpn-5f6c01ea6172ed1d8ed04e31f9f6c3f8e4696109.tar.xz
openvpn-5f6c01ea6172ed1d8ed04e31f9f6c3f8e4696109.zip
On signal reception, return EAI_SYSTEM from openvpn_getaddrinfo().
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. Trac #276 Signed-off-by: Gert Doering <gert@greenie.muc.de> Acked-by: Arne Schwabe <arne@rfc2549.org> Message-Id: <1433104918-9523-1-git-send-email-gert@greenie.muc.de> URL: http://article.gmane.org/gmane.network.openvpn.devel/9764
-rw-r--r--src/openvpn/socket.c5
1 files changed, 4 insertions, 1 deletions
diff --git a/src/openvpn/socket.c b/src/openvpn/socket.c
index 13ed981..e751154 100644
--- a/src/openvpn/socket.c
+++ b/src/openvpn/socket.c
@@ -412,10 +412,13 @@ openvpn_getaddrinfo (unsigned int flags,
}
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;
}