efe9536 sss_client: Fix race condition in memory cache

4 files Authored by lslebodn 9 years ago, Committed by jhrozek 9 years ago,
    sss_client: Fix race condition in memory cache
    
    Thread safe initialisation was fixed in ticket #2380, but there is
    still race condition in reinitialisation.
    
    If caches is invalidated with command sss_cache -U (-G or -E) then
    client code will need to reinitialize fast memory cache.
    Let say we have two threads. The 1st thread find out that memory cache
    should be reinitialized; therefore the fast memory cached is unmapped
    and context destroyed. In the same time, 2nd thread tried to check
    header of memory cache whether it is initialized and valid. As a result
    of previously unmapped memory the 2nd thread access
    out of bound memory (SEGFAULT).
    
    The destroying of fast memory cache cannot be done any time. We need
    to be sure that there isn't any other thread which uses mmaped memory.
    The new counter of active threads was added for this purpose. The state
    of fast memory cache was converted from boolean to three value state
    (UNINITIALIZED, INITIALIZED, RECYCLED)
    UNINITIALIZED
        - the fast memory cache need to be initialized.
        - if there is a problem with initialisation the state will not change
        - after successful initialisation, the state will change to INITIALIZED
    INITIALIZED
        - if the cahe was invalidated or there is any other problem was
          detected in memory cache header the state will change to RECYCLED
          and memory cache IS NOT destroyed.
    RECYCLED
        - nothing will be done is there are any active threads which may use
          the data from mmaped memory
        - if there aren't active threads the fast memory cahe is destroyed and
          state is changed to UNINITIALIZED.
    
    https://fedorahosted.org/sssd/ticket/2445
    
    Reviewed-by: Michal Židek <mzidek@redhat.com>
    (cherry picked from commit 6a60e29468fc6b4043a4dc52d3aab73e8465db70)
    
        
file modified
+9 -1