[lkml]   [2010]   [May]   [24]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
Messages in this thread
Patch in this message
Subject[16/34] inotify: race use after free/double free in inotify inode marks
2.6.34-stable review patch.  If anyone has any objections, please let us know.


From: Eric Paris <>

commit e08733446e72b983fed850fc5d8bd21b386feb29 upstream.

There is a race in the inotify add/rm watch code. A task can find and
remove a mark which doesn't have all of it's references. This can
result in a use after free/double free situation.

Task A Task B
------------ -----------
allocate a mark (refcnt == 1)
add it to the idr
refcnt hits 0, free
take reference because we are on idr
[at this point it is a use after free]
[time goes on]
refcnt may hit 0 again, double free

The fix is to take the reference BEFORE the object can be found in the

Signed-off-by: Eric Paris <>
Signed-off-by: Greg Kroah-Hartman <>

fs/notify/inotify/inotify_user.c | 9 ++++++---
1 file changed, 6 insertions(+), 3 deletions(-)

--- a/fs/notify/inotify/inotify_user.c
+++ b/fs/notify/inotify/inotify_user.c
@@ -556,21 +556,24 @@ retry:
if (unlikely(!idr_pre_get(&group->inotify_data.idr, GFP_KERNEL)))
goto out_err;

+ /* we are putting the mark on the idr, take a reference */
+ fsnotify_get_mark(&tmp_ientry->fsn_entry);
ret = idr_get_new_above(&group->inotify_data.idr, &tmp_ientry->fsn_entry,
if (ret) {
+ /* we didn't get on the idr, drop the idr reference */
+ fsnotify_put_mark(&tmp_ientry->fsn_entry);
/* idr was out of memory allocate and try again */
if (ret == -EAGAIN)
goto retry;
goto out_err;

- /* we put the mark on the idr, take a reference */
- fsnotify_get_mark(&tmp_ientry->fsn_entry);
/* we are on the idr, now get on the inode */
ret = fsnotify_add_mark(&tmp_ientry->fsn_entry, group, inode);
if (ret) {

 \ /
  Last update: 2010-05-25 01:15    [W:0.083 / U:5.468 seconds]
©2003-2018 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site