Skip to content
  • Sebastian Dröge's avatar
    GSettingsBackend - Fix thread-safety during destruction of GSettings instances... · d3ae4b1d
    Sebastian Dröge authored
    GSettingsBackend - Fix thread-safety during destruction of GSettings instances while notifications are emitted
    
    g_settings_backend_watch() uses a weak notify for keeping track of
    the target. There's an explanation why this is supposed to be safe but
    that explanation is wrong.
    
    The following could happen before:
    
    1. We have the target stored in the watch list
    2. The last reference to the target is dropped in thread A and we end up
       in g_settings_backend_watch_weak_notify() right before the mutex
    3. g_settings_backend_dispatch_signal() is called from another thread B
       and gets the mutex before 2.
    4. g_weak_ref_init() is called on the target from thread B, which at
       this point has a reference count of exactly one (see g_object_unref()
       where it calls the weak notifies)
    5. Thread A continues at 3. and drops the last reference and destroys
       the object. Now the GWeakRef from 4. points to a destroyed object. Note
       that GWeakRefs would be cleared before the weak notifies are called
    6. At some later poi...
    d3ae4b1d