[libvirt] [PATCH] virNetClientSetTLSSession: Restore original signal mask

Daniel P. Berrange berrange at redhat.com
Wed Mar 19 17:44:18 UTC 2014


On Wed, Mar 19, 2014 at 06:29:01PM +0100, Michal Privoznik wrote:
> Currently, we use pthread_sigmask(SIG_BLOCK, ...) prior to calling
> poll(). This is okay, as we don't want poll() to be interrupted.
> However, then - immediately as we fall out from the poll() - we try to
> restore the original sigmask - again using SIG_BLOCK. But as the man
> page says, SIG_BLOCK adds signals to the signal mask:
> 
> SIG_BLOCK
>       The set of blocked signals is the union of the current set and the set argument.
> 
> Therefore, when restoring the original mask, we need to completely
> overwrite the one we set earlier and hence we should be using:
> 
> SIG_SETMASK
>       The set of blocked signals is set to the argument set.
> 
> Signed-off-by: Michal Privoznik <mprivozn at redhat.com>
> ---
> 
> Notes:
>     This is a very old bug. It's worth backporting onto all maint branches we have.
> 
>  src/rpc/virnetclient.c | 4 ++--
>  1 file changed, 2 insertions(+), 2 deletions(-)
> 
> diff --git a/src/rpc/virnetclient.c b/src/rpc/virnetclient.c
> index b288b74..255997b 100644
> --- a/src/rpc/virnetclient.c
> +++ b/src/rpc/virnetclient.c
> @@ -792,7 +792,7 @@ int virNetClientSetTLSSession(virNetClientPtr client,
>          if (ret < 0 && (errno == EAGAIN || errno == EINTR))
>              goto repoll;
>  
> -        ignore_value(pthread_sigmask(SIG_BLOCK, &oldmask, NULL));
> +        ignore_value(pthread_sigmask(SIG_SETMASK, &oldmask, NULL));
>      }
>  
>      ret = virNetTLSContextCheckCertificate(tls, client->tls);
> @@ -816,7 +816,7 @@ int virNetClientSetTLSSession(virNetClientPtr client,
>      if (ret < 0 && (errno == EAGAIN || errno == EINTR))
>          goto repoll2;
>  
> -    ignore_value(pthread_sigmask(SIG_BLOCK, &oldmask, NULL));
> +    ignore_value(pthread_sigmask(SIG_SETMASK, &oldmask, NULL));
>  
>      len = virNetTLSSessionRead(client->tls, buf, 1);
>      if (len < 0 && errno != ENOMSG) {

ACK, I see other places in our code get this right already


Regards,
Daniel
-- 
|: http://berrange.com      -o-    http://www.flickr.com/photos/dberrange/ :|
|: http://libvirt.org              -o-             http://virt-manager.org :|
|: http://autobuild.org       -o-         http://search.cpan.org/~danberr/ :|
|: http://entangle-photo.org       -o-       http://live.gnome.org/gtk-vnc :|




More information about the libvir-list mailing list