Dongli Zhang f7c8a4120e loop: access lo_backing_file only when the loop device is Lo_bound
Commit 758a58d0bc67 ("loop: set GENHD_FL_NO_PART_SCAN after
blkdev_reread_part()") separates "lo->lo_backing_file = NULL" and
"lo->lo_state = Lo_unbound" into different critical regions protected by
loop_ctl_mutex.

However, there is below race that the NULL lo->lo_backing_file would be
accessed when the backend of a loop is another loop device, e.g., loop0's
backend is a file, while loop1's backend is loop0.

loop0's backend is file            loop1's backend is loop0

__loop_clr_fd()
  mutex_lock(&loop_ctl_mutex);
  lo->lo_backing_file = NULL; --> set to NULL
  mutex_unlock(&loop_ctl_mutex);
                                   loop_set_fd()
                                     mutex_lock_killable(&loop_ctl_mutex);
                                     loop_validate_file()
                                       f = l->lo_backing_file; --> NULL
                                         access if loop0 is not Lo_unbound
  mutex_lock(&loop_ctl_mutex);
  lo->lo_state = Lo_unbound;
  mutex_unlock(&loop_ctl_mutex);

lo->lo_backing_file should be accessed only when the loop device is
Lo_bound.

In fact, the problem has been introduced already in commit 7ccd0791d985
("loop: Push loop_ctl_mutex down into loop_clr_fd()") after which
loop_validate_file() could see devices in Lo_rundown state with which it
did not count. It was harmless at that point but still.

Fixes: 7ccd0791d985 ("loop: Push loop_ctl_mutex down into loop_clr_fd()")
Reported-by: syzbot+9bdc1adc1c55e7fe765b@syzkaller.appspotmail.com
Signed-off-by: Dongli Zhang <dongli.zhang@oracle.com>
Reviewed-by: Jan Kara <jack@suse.cz>
Signed-off-by: Jens Axboe <axboe@kernel.dk>
2019-03-18 08:20:53 -06:00
..
2019-03-16 13:05:32 -07:00
2019-03-09 16:53:47 -08:00
2019-03-16 13:05:32 -07:00
2019-03-06 09:41:12 -08:00
2019-03-16 13:05:32 -07:00
2019-03-14 09:11:54 -07:00
2019-03-09 14:57:08 -08:00
2019-03-06 14:18:59 -08:00
2019-03-15 14:37:46 -07:00
2019-03-08 10:02:58 -08:00
2019-03-11 20:06:18 -07:00
2019-03-15 14:41:30 -07:00
2019-03-10 10:17:23 -07:00
2019-03-10 13:16:37 -07:00
2019-03-07 08:59:26 -07:00
2019-03-16 12:36:39 -07:00
2019-03-10 11:54:48 -07:00
2019-03-10 11:54:48 -07:00
2019-03-09 15:53:03 -08:00
2019-03-08 14:12:17 -08:00
2019-03-16 13:05:32 -07:00
2019-03-16 12:36:39 -07:00
2019-03-10 11:54:48 -07:00
2019-03-10 12:29:52 -07:00
2019-03-10 10:17:23 -07:00
2019-03-08 08:23:15 -08:00
2019-03-12 09:46:32 -07:00
2019-03-14 09:00:06 -07:00
2019-03-12 09:46:32 -07:00
2019-03-16 12:51:50 -07:00
2019-03-06 09:41:12 -08:00
2019-03-09 14:57:08 -08:00
2019-03-09 14:45:54 -08:00
2019-03-16 12:51:50 -07:00
2019-03-06 09:41:12 -08:00
2019-03-14 09:11:54 -07:00
2019-03-07 12:56:26 -08:00
2019-03-10 12:47:57 -07:00
2019-03-15 14:22:59 -07:00
2019-03-11 11:22:15 -07:00
2019-03-10 12:29:52 -07:00