> -----Original Message----- > From: David Howells [mailto:dhowe...@redhat.com] > Sent: Wednesday, February 22, 2017 6:32 PM > To: Reshetova, Elena <elena.reshet...@intel.com> > Cc: dhowe...@redhat.com; linux-kernel@vger.kernel.org; linux- > a...@lists.infradead.org; pet...@infradead.org; gre...@linuxfoundation.org; > Hans Liljestrand <ishkam...@gmail.com>; Kees Cook > <keesc...@chromium.org>; David Windsor <dwind...@gmail.com> > Subject: Re: [PATCH 3/4] fs, afs: convert afs_server.usage from atomic_t to > refcount_t > > Elena Reshetova <elena.reshet...@intel.com> wrote: > > > refcount_t type and corresponding API should be > > used instead of atomic_t when the variable is used as > > a reference counter. This allows to avoid accidental > > refcounter overflows that might lead to use-after-free > > situations. > > Although I don't see an assertion for this (the window is too small), it is > possible for a dead server record to get resurrected. Take a look at > afs_put_server() and note there's a check around the move to the graveyard.
This one is harder to transform correctly using +1 scheme. As far as I understand, I would need to take an additional lock in afs_put_server() to accommodate this section: @@ -230,12 +230,17 @@ void afs_put_server(struct afs_server *server) _debug("PUT SERVER %d", refcount_read(&server->usage)); - ASSERTCMP(refcount_read(&server->usage), >, 0); + ASSERTCMP(refcount_read(&server->usage), >, 1); - if (likely(!refcount_dec_and_test(&server->usage))) { + /* need a write lock for &server the following section */ + refcount_dec(&server->usage); + + if (likely(refcount_read(&server->usage) > 1)) { + spin_unlock(&old_server->fs_lock); _leave(""); return; } + /* end of lock section */ And smth tells me that you don't want to have any locks here... Right? Same story is with afs_vlocation_lookup(). Best Regards, Elena. > > So, please hold this patch also. > > David