Am 31.05.15 um 22:41 schrieb Gert Doering:
> 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;
>                      }
ACK. The patch is doing the right thing.

Arne

Reply via email to