[PATCH 3.14 34/43] cifs: fix use-after-free bug in find_writable_file

2015-04-17 Thread Greg Kroah-Hartman
3.14-stable review patch.  If anyone has any objections, please let me know.

--

From: David Disseldorp 

commit e1e9bda22d7ddf88515e8fe401887e313922823e upstream.

Under intermittent network outages, find_writable_file() is susceptible
to the following race condition, which results in a user-after-free in
the cifs_writepages code-path:

Thread 1Thread 2


inv_file = NULL
refind = 0
spin_lock(_file_list_lock)

// invalidHandle found on openFileList

inv_file = open_file
// inv_file->count currently 1

cifsFileInfo_get(inv_file)
// inv_file->count = 2

spin_unlock(_file_list_lock);

cifs_reopen_file()cifs_close()
// fails (rc != 0)->cifsFileInfo_put()
   spin_lock(_file_list_lock)
   // inv_file->count = 1
   spin_unlock(_file_list_lock)

spin_lock(_file_list_lock);
list_move_tail(_file->flist,
  _inode->openFileList);
spin_unlock(_file_list_lock);

cifsFileInfo_put(inv_file);
->spin_lock(_file_list_lock)

  // inv_file->count = 0
  list_del(_file->flist);
  // cleanup!!
  kfree(cifs_file);

  spin_unlock(_file_list_lock);

spin_lock(_file_list_lock);
++refind;
// refind = 1
goto refind_writable;

At this point we loop back through with an invalid inv_file pointer
and a refind value of 1. On second pass, inv_file is not overwritten on
openFileList traversal, and is subsequently dereferenced.

Signed-off-by: David Disseldorp 
Reviewed-by: Jeff Layton 
Signed-off-by: Steve French 
Signed-off-by: Greg Kroah-Hartman 

---
 fs/cifs/file.c |1 +
 1 file changed, 1 insertion(+)

--- a/fs/cifs/file.c
+++ b/fs/cifs/file.c
@@ -1821,6 +1821,7 @@ refind_writable:
cifsFileInfo_put(inv_file);
spin_lock(_file_list_lock);
++refind;
+   inv_file = NULL;
goto refind_writable;
}
}


--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


[PATCH 3.14 34/43] cifs: fix use-after-free bug in find_writable_file

2015-04-17 Thread Greg Kroah-Hartman
3.14-stable review patch.  If anyone has any objections, please let me know.

--

From: David Disseldorp dd...@suse.de

commit e1e9bda22d7ddf88515e8fe401887e313922823e upstream.

Under intermittent network outages, find_writable_file() is susceptible
to the following race condition, which results in a user-after-free in
the cifs_writepages code-path:

Thread 1Thread 2


inv_file = NULL
refind = 0
spin_lock(cifs_file_list_lock)

// invalidHandle found on openFileList

inv_file = open_file
// inv_file-count currently 1

cifsFileInfo_get(inv_file)
// inv_file-count = 2

spin_unlock(cifs_file_list_lock);

cifs_reopen_file()cifs_close()
// fails (rc != 0)-cifsFileInfo_put()
   spin_lock(cifs_file_list_lock)
   // inv_file-count = 1
   spin_unlock(cifs_file_list_lock)

spin_lock(cifs_file_list_lock);
list_move_tail(inv_file-flist,
  cifs_inode-openFileList);
spin_unlock(cifs_file_list_lock);

cifsFileInfo_put(inv_file);
-spin_lock(cifs_file_list_lock)

  // inv_file-count = 0
  list_del(cifs_file-flist);
  // cleanup!!
  kfree(cifs_file);

  spin_unlock(cifs_file_list_lock);

spin_lock(cifs_file_list_lock);
++refind;
// refind = 1
goto refind_writable;

At this point we loop back through with an invalid inv_file pointer
and a refind value of 1. On second pass, inv_file is not overwritten on
openFileList traversal, and is subsequently dereferenced.

Signed-off-by: David Disseldorp dd...@suse.de
Reviewed-by: Jeff Layton jlay...@samba.org
Signed-off-by: Steve French smfre...@gmail.com
Signed-off-by: Greg Kroah-Hartman gre...@linuxfoundation.org

---
 fs/cifs/file.c |1 +
 1 file changed, 1 insertion(+)

--- a/fs/cifs/file.c
+++ b/fs/cifs/file.c
@@ -1821,6 +1821,7 @@ refind_writable:
cifsFileInfo_put(inv_file);
spin_lock(cifs_file_list_lock);
++refind;
+   inv_file = NULL;
goto refind_writable;
}
}


--
To unsubscribe from this list: send the line unsubscribe linux-kernel in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/