Tejun Heo
8e00c4e9dd
writeback: fix use-after-free in finish_writeback_work()
finish_writeback_work() reads @done->waitq after decrementing
@done->cnt. However, once @done->cnt reaches zero, @done may be freed
(from stack) at any moment and @done->waitq can contain something
unrelated by the time finish_writeback_work() tries to read it. This
led to the following crash.
"BUG: kernel NULL pointer dereference, address: 0000000000000002"
#PF: supervisor write access in kernel mode
#PF: error_code(0x0002) - not-present page
PGD 0 P4D 0
Oops: 0002 [#1] SMP DEBUG_PAGEALLOC
CPU: 40 PID: 555153 Comm: kworker/u98:50 Kdump: loaded Not tainted
...
Workqueue: writeback wb_workfn (flush-btrfs-1)
RIP: 0010:_raw_spin_lock_irqsave+0x10/0x30
Code: 48 89 d8 5b c3 e8 50 db 6b ff eb f4 0f 1f 40 00 66 2e 0f 1f 84 00 00 00 00 00 0f 1f 44 00 00 53 9c 5b fa 31 c0 ba 01 00 00 00 <f0> 0f b1 17 75 05 48 89 d8 5b c3 89 c6 e8 fe ca 6b ff eb f2 66 90
RSP: 0018:ffffc90049b27d98 EFLAGS: 00010046
RAX: 0000000000000000 RBX: 0000000000000246 RCX: 0000000000000000
RDX: 0000000000000001 RSI: 0000000000000003 RDI: 0000000000000002
RBP: 0000000000000000 R08: 0000000000000000 R09: 0000000000000001
R10: ffff889fff407600 R11: ffff88ba9395d740 R12: 000000000000e300
R13: 0000000000000003 R14: 0000000000000000 R15: 0000000000000000
FS: 0000000000000000(0000) GS:ffff88bfdfa00000(0000) knlGS:0000000000000000
CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033
CR2: 0000000000000002 CR3: 0000000002409005 CR4: 00000000001606e0
Call Trace:
__wake_up_common_lock+0x63/0xc0
wb_workfn+0xd2/0x3e0
process_one_work+0x1f5/0x3f0
worker_thread+0x2d/0x3d0
kthread+0x111/0x130
ret_from_fork+0x1f/0x30
Fix it by reading and caching @done->waitq before decrementing
@done->cnt.
Link: http://lkml.kernel.org/r/20190924010631.GH2233839@devbig004.ftw2.facebook.com
Fixes: 5b9cce4c7e ("writeback: Generalize and expose wb_completion")
Signed-off-by: Tejun Heo <tj@kernel.org>
Debugged-by: Chris Mason <clm@fb.com>
Reviewed-by: Jens Axboe <axboe@kernel.dk>
Cc: Jan Kara <jack@suse.cz>
Cc: <stable@vger.kernel.org> [5.2+]
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
2019-10-07 15:47:19 -07:00
..
2019-09-27 15:10:34 -07:00
2019-07-19 11:33:22 -07:00
2019-08-30 07:27:18 -07:00
2019-09-29 19:42:07 -07:00
2019-07-27 10:03:14 -04:00
2019-08-30 07:27:17 -07:00
2019-08-30 07:27:17 -07:00
2019-09-30 10:25:24 -07:00
2019-05-24 17:27:11 +02:00
2019-09-25 10:21:13 -07:00
2019-09-29 19:37:32 -07:00
2019-09-19 09:42:37 -07:00
2019-09-19 13:09:28 -07:00
2019-09-19 10:06:57 -07:00
2019-08-12 19:18:50 -07:00
2019-09-28 08:14:15 -07:00
2019-09-03 09:30:56 -04:00
2019-07-12 17:37:53 -07:00
2019-07-14 19:29:04 -07:00
2019-07-19 10:42:02 -07:00
2019-08-30 07:27:17 -07:00
2019-10-01 04:54:45 +08:00
2019-07-31 13:31:05 -06:00
2019-09-21 13:53:34 -07:00
2019-09-29 19:25:39 -07:00
2019-09-21 14:26:33 -07:00
2019-09-25 17:51:40 -07:00
2019-08-30 07:27:17 -07:00
2019-07-10 18:43:43 -07:00
2019-09-27 15:54:24 -07:00
2019-09-24 12:33:34 -07:00
2019-05-21 10:50:46 +02:00
2019-07-16 19:23:23 -07:00
2019-05-12 17:52:13 -04:00
2019-08-30 08:11:25 -07:00
2019-07-19 10:42:02 -07:00
2019-09-19 15:32:45 -07:00
2019-09-19 09:42:37 -07:00
2019-09-24 15:54:07 -07:00
2019-09-26 11:33:30 -07:00
2019-09-19 09:42:37 -07:00
2019-09-19 09:42:37 -07:00
2019-07-03 17:52:09 -04:00
2019-08-30 07:27:17 -07:00
2019-09-26 12:20:14 -07:00
2019-05-21 10:50:46 +02:00
2019-09-27 17:00:27 -07:00
2019-07-01 08:25:34 -07:00
2019-05-21 10:50:46 +02:00
2019-09-27 17:00:27 -07:00
2019-09-26 10:10:44 -07:00
2019-10-07 15:47:19 -07:00
2019-08-30 08:11:25 -07:00
2019-07-19 10:42:02 -07:00
2019-09-19 10:21:35 -07:00
2019-09-11 16:11:45 +02:00
2019-09-28 08:14:15 -07:00
2019-08-30 08:11:25 -07:00
2019-08-30 07:27:17 -07:00
2019-08-30 07:27:17 -07:00
2019-07-31 12:04:42 +02:00
2019-09-12 21:05:34 -04:00
2019-09-25 17:51:40 -07:00
2019-09-19 10:06:57 -07:00
2019-09-19 10:06:57 -07:00
2019-07-19 10:42:02 -07:00
2019-08-30 07:27:18 -07:00
2019-09-28 08:14:15 -07:00
2019-09-21 11:10:16 -07:00
2019-09-04 18:19:43 +02:00
2019-09-19 09:42:37 -07:00
2019-09-17 11:48:24 -04:00
2019-08-12 19:33:50 -07:00
2019-09-26 11:36:20 -07:00
2019-07-19 10:42:02 -07:00
2019-07-19 10:42:02 -07:00
2019-08-30 07:27:17 -07:00
2019-05-21 10:50:45 +02:00
2019-05-30 11:26:32 -07:00
2019-09-26 11:38:55 -07:00
2019-05-21 10:50:45 +02:00
2019-07-16 19:23:22 -07:00
2019-07-19 10:42:02 -07:00
2019-05-21 10:50:45 +02:00
2019-09-18 17:35:20 -07:00
2019-07-15 21:20:52 -07:00
2019-05-24 20:50:36 +02:00
2019-05-30 11:29:21 -07:00
2019-07-30 14:42:13 -07:00
2019-06-19 17:09:55 +02:00
2019-08-03 07:02:01 -07:00
2019-08-30 19:31:09 -04:00
2019-08-05 14:59:05 -07:00
2019-07-20 09:15:51 -07:00
2019-05-21 10:50:45 +02:00
2019-06-29 09:47:31 -06:00
2019-05-21 10:50:45 +02:00
2019-08-21 00:20:40 +02:00
2019-09-25 17:42:30 +02:00
2019-04-08 18:21:02 -05:00
2019-08-07 21:51:47 -04:00
2019-08-19 11:00:39 -04:00
2019-03-08 14:48:40 -08:00
2019-02-28 03:29:26 -05:00
2019-09-06 21:28:49 +02:00
2019-09-12 21:06:14 -04:00
2019-07-16 22:52:37 -04:00
2019-05-21 10:50:45 +02:00
2019-10-07 15:47:19 -07:00
2019-07-19 10:42:02 -07:00
2019-09-24 15:54:11 -07:00
2019-07-20 09:15:51 -07:00
2019-10-04 09:56:51 -07:00
2019-09-18 16:59:14 -07:00
2019-06-24 09:16:47 +10:00
2019-07-19 10:42:02 -07:00
2019-09-27 17:00:27 -07:00
2019-09-18 16:59:14 -07:00
2019-05-21 10:50:45 +02:00
2019-07-16 22:52:37 -04:00
2019-07-10 09:00:57 -06:00
2019-09-03 09:30:45 -04:00
2019-09-26 10:29:42 -07:00
2019-05-30 11:26:32 -07:00
2019-05-25 18:00:06 -04:00
2019-09-26 10:10:30 -07:00
2019-05-25 18:00:07 -04:00
2019-06-17 17:36:09 -04:00
2019-05-30 11:29:53 -07:00
2019-05-21 10:50:45 +02:00
2019-09-06 21:28:49 +02:00
2019-08-16 18:43:24 -07:00
2019-07-16 19:23:25 -07:00
2019-08-13 16:06:52 -07:00
2019-04-08 18:21:02 -05:00
2019-05-31 15:30:03 -06:00
2019-05-21 10:50:45 +02:00
2019-10-03 14:21:35 -07:00
2019-09-25 09:55:59 -07:00
2019-05-14 09:47:50 -07:00
2019-08-01 20:51:23 +02:00
2019-09-25 17:51:41 -07:00
2019-08-30 07:27:17 -07:00
2019-05-21 10:50:45 +02:00