]> www.infradead.org Git - users/jedix/linux-maple.git/commitdiff
btrfs: async-thread: Fix a use-after-free error for trace
authorQu Wenruo <quwenruo@cn.fujitsu.com>
Fri, 22 Jan 2016 01:28:38 +0000 (09:28 +0800)
committerChuck Anderson <chuck.anderson@oracle.com>
Thu, 26 May 2016 22:45:58 +0000 (15:45 -0700)
Orabug: 23331040

[ Upstream commit 0a95b851370b84a4b9d92ee6d1fa0926901d0454 ]

Parameter of trace_btrfs_work_queued() can be freed in its workqueue.
So no one use use that pointer after queue_work().

Fix the user-after-free bug by move the trace line before queue_work().

Reported-by: Dave Jones <davej@codemonkey.org.uk>
Signed-off-by: Qu Wenruo <quwenruo@cn.fujitsu.com>
Reviewed-by: David Sterba <dsterba@suse.com>
Signed-off-by: Chris Mason <clm@fb.com>
Signed-off-by: Sasha Levin <sasha.levin@oracle.com>
(cherry picked from commit b9a54ed91c7bbd5c18a4170be078d9f7e28560ed)

Signed-off-by: Dan Duval <dan.duval@oracle.com>
fs/btrfs/async-thread.c

index df9932b00d08fdc666f63c84014fbd08889cf624..1848705506ff6ad1ec3f9e8a02e2725fdbed5141 100644 (file)
@@ -316,8 +316,8 @@ static inline void __btrfs_queue_work(struct __btrfs_workqueue *wq,
                list_add_tail(&work->ordered_list, &wq->ordered_list);
                spin_unlock_irqrestore(&wq->list_lock, flags);
        }
-       queue_work(wq->normal_wq, &work->normal_work);
        trace_btrfs_work_queued(work);
+       queue_work(wq->normal_wq, &work->normal_work);
 }
 
 void btrfs_queue_work(struct btrfs_workqueue *wq,