diff options
author | Gert Doering <gert@greenie.muc.de> | 2015-05-31 22:41:58 +0200 |
---|---|---|
committer | Gert Doering <gert@greenie.muc.de> | 2015-06-01 16:53:07 +0200 |
commit | 38c9f980d4f7cb7061f9db3ed8645ab3404e533d (patch) | |
tree | 80a7549c3684537c2bb1a241fa5addce8cc4de58 /src/openvpn/socket.c | |
parent | 7a65a62f9a984b02143d6df03a67308d6b11ca98 (diff) | |
download | openvpn-38c9f980d4f7cb7061f9db3ed8645ab3404e533d.tar.gz openvpn-38c9f980d4f7cb7061f9db3ed8645ab3404e533d.tar.xz openvpn-38c9f980d4f7cb7061f9db3ed8645ab3404e533d.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
(cherry picked from commit 5f6c01ea6172ed1d8ed04e31f9f6c3f8e4696109)
Diffstat (limited to 'src/openvpn/socket.c')
-rw-r--r-- | src/openvpn/socket.c | 5 |
1 files changed, 4 insertions, 1 deletions
diff --git a/src/openvpn/socket.c b/src/openvpn/socket.c index af13e36..bff22a9 100644 --- a/src/openvpn/socket.c +++ b/src/openvpn/socket.c @@ -215,10 +215,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; } |