mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/netfilter/nf.git
synced 2026-04-17 22:24:18 -04:00
closures: CLOSURE_CALLBACK() to fix type punning
Control flow integrity is now checking that type signatures match on indirect function calls. That breaks closures, which embed a work_struct in a closure in such a way that a closure_fn may also be used as a workqueue fn by the underlying closure code. So we have to change closure fns to take a work_struct as their argument - but that results in a loss of clarity, as closure fns have different semantics from normal workqueue functions (they run owning a ref on the closure, which must be released with continue_at() or closure_return()). Thus, this patc introduces CLOSURE_CALLBACK() and closure_type() macros as suggested by Kees, to smooth things over a bit. Suggested-by: Kees Cook <keescook@chromium.org> Cc: Coly Li <colyli@suse.de> Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>
This commit is contained in:
@@ -36,7 +36,7 @@ static inline void closure_put_after_sub(struct closure *cl, int flags)
|
||||
closure_debug_destroy(cl);
|
||||
|
||||
if (destructor)
|
||||
destructor(cl);
|
||||
destructor(&cl->work);
|
||||
|
||||
if (parent)
|
||||
closure_put(parent);
|
||||
@@ -108,8 +108,9 @@ struct closure_syncer {
|
||||
int done;
|
||||
};
|
||||
|
||||
static void closure_sync_fn(struct closure *cl)
|
||||
static CLOSURE_CALLBACK(closure_sync_fn)
|
||||
{
|
||||
struct closure *cl = container_of(ws, struct closure, work);
|
||||
struct closure_syncer *s = cl->s;
|
||||
struct task_struct *p;
|
||||
|
||||
|
||||
Reference in New Issue
Block a user