Skip to contentSkip to conversation

bcache: safeguard a dangerous addressing in closure_queue

PATCH In review Liang Chen 2 participants 2 messages Oct 13, 2017 bcache (block layer cache)

lore
Share & tools
lore

Liang Chen

author
#0 lore raw

PATCH v2 1/1 bcache: safeguard a dangerous addressing in closure_queue

The use of the union reduces the size of closure struct by taking advantage of the current size of its members. The offset of func in work_struct equals the size of the first three members, so that work.work_func will just reference the forth member - fn.

This is smart but dangerous. It can be broken if work_struct or the other structs get changed, and can be a bit difficult to debug.

---
Replacing all occurences of closure_fn to work_func_fn seems to be an option but that would end up with a big lenghty and error prone patch.

 drivers/md/bcache/closure.h | 6 ++++++
 1 file changed, 6 insertions(+)
drivers/md/bcache/closure.h +6 -0
index 295b7e4..00fb314 100644
@@ -251,6 +251,12 @@ static inline void set_closure_fn(struct closure *cl, closure_fn *fn,
 static inline void closure_queue(struct closure *cl)
 {
 	struct workqueue_struct *wq = cl->wq;
+	/**
+	 * Changes made to closure, work_struct, or a couple of other structs
+	 * may cause work.func not pointing to the right location.
+	 */
+	BUILD_BUG_ON(offsetof(struct closure, fn)
+		     != offsetof(struct work_struct, func));
 	if (wq) {
 		INIT_WORK(&cl->work, cl->work.func);
 		BUG_ON(!queue_work(wq, &cl->work));
Signature · 1 line
1.8.3.1
Reviewed-by on v2 1/1
#1 lore raw

Hi Liang--

Thanks for the quick turnaround. I've added this to bcache-for-next.

Quoted 9 lines · Liang Chen

The use of the union reduces the size of closure struct by taking advantage of the current size of its members. The offset of func in work_struct equals the size of the first three members, so that work.work_func will just reference the forth member - fn.

This is smart but dangerous. It can be broken if work_struct or the other structs get changed, and can be a bit difficult to debug.

-Mike