On Wed, Apr 20, 2022 at 03:11:42PM -0700, Andrew Morton wrote: > On Wed, 20 Apr 2022 14:37:34 +1000 Alistair Popple <apopple@xxxxxxxxxx> wrote: > > > In some cases it is possible for mmu_interval_notifier_remove() to race > > with mn_tree_inv_end() allowing it to return while the notifier data > > structure is still in use. Consider the following sequence: > > > > CPU0 - mn_tree_inv_end() CPU1 - mmu_interval_notifier_remove() > > spin_lock(subscriptions->lock); > > seq = subscriptions->invalidate_seq; > > spin_lock(subscriptions->lock); spin_unlock(subscriptions->lock); > > subscriptions->invalidate_seq++; > > wait_event(invalidate_seq != seq); > > return; > > interval_tree_remove(interval_sub); kfree(interval_sub); > > spin_unlock(subscriptions->lock); > > wake_up_all(); > > > > As the wait_event() condition is true it will return immediately. This > > can lead to use-after-free type errors if the caller frees the data > > structure containing the interval notifier subscription while it is > > still on a deferred list. Fix this by taking the appropriate lock when > > reading invalidate_seq to ensure proper synchronisation. > > > > ... > > > > Fixes: 99cb252f5e68 ("mm/mmu_notifier: add an interval tree notifier") > > Do you think fix this should be backported into older kernels? I think it should be tagged stable, yes Jason