Files
kernel_amazon_mt8127-common/fs
David Disseldorp 57cf01ac9f cifs: fix use-after-free bug in find_writable_file
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 1                                        Thread 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 <ddiss@suse.de>
Reviewed-by: Jeff Layton <jlayton@samba.org>
Signed-off-by: Steve French <smfrench@gmail.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
2015-04-19 10:10:50 +02:00
..
2013-05-07 20:16:25 -07:00
2013-05-07 20:16:25 -07:00
2015-03-26 15:00:57 +01:00
2013-05-24 16:22:51 -07:00
2013-07-13 11:42:26 -07:00
2013-04-29 15:41:42 -04:00
2013-11-13 12:05:31 +09:00
2013-05-07 20:16:25 -07:00
2015-01-16 06:59:00 -08:00
2013-04-29 15:40:23 -04:00
2013-10-05 07:13:09 -07:00
2013-05-07 20:16:25 -07:00
2014-09-17 09:04:02 -07:00
2013-04-17 13:25:09 +01:00
2014-09-17 09:04:02 -07:00
2013-05-31 15:16:33 -04:00
2014-02-13 13:47:59 -08:00