• M
    rpc: virnetserver: Fix race on srv->nclients_unauth · 94bbbcee
    Marc Hartmayer 提交于
    There is a race between virNetServerProcessClients (main thread) and
    remoteDispatchAuthList/remoteDispatchAuthPolkit/remoteSASLFinish (worker
    thread) that can lead to decrementing srv->nclients_unauth when it's
    zero. Since virNetServerCheckLimits relies on the value
    srv->nclients_unauth the underrun causes libvirtd to stop accepting
    new connections forever.
    
    Example race scenario (assuming libvirtd is using policykit and the
    client is privileged):
      1. The client calls the RPC remoteDispatchAuthList =>
         remoteDispatchAuthList is executed on a worker thread (Thread
         T1). We're assuming now the execution stops for some time before
         the line 'virNetServerClientSetAuth(client, 0)'
      2. The client closes the connection irregularly. This causes the
         event loop to wake up and virNetServerProcessClient to be
         called (on the main thread T0). During the
         virNetServerProcessClients the srv lock is hold. The condition
         virNetServerClientNeedAuth(client) will be checked and as the
         authentication is not finished right now
         virNetServerTrackCompletedAuthLocked(srv) will be called =>
         --srv->nclients_unauth => 0
      3. The Thread T1 continues, marks the client as authenticated, and
         calls virNetServerTrackCompletedAuthLocked(srv) =>
         --srv->nclients_unauth => --0 => wrap around as nclient_unauth is
         unsigned
      4. virNetServerCheckLimits(srv) will disable the services forever
    
    To fix it, add an auth_pending field to the client struct so that it
    is now possible to determine if the authentication process has already
    been handled for this client.
    
    Setting the authentication method to none for the client in
    virNetServerProcessClients is not a proper way to indicate that the
    counter has been decremented, as this would imply that the client is
    authenticated.
    
    Additionally, adjust the existing test cases for this new field.
    Signed-off-by: NMarc Hartmayer <mhartmay@linux.vnet.ibm.com>
    Reviewed-by: NBoris Fiuczynski <fiuczy@linux.vnet.ibm.com>
    94bbbcee
virnetserverclient.h 7.5 KB