From: Jakub Kicinski Date: Fri, 24 Nov 2017 02:12:00 +0000 (-0800) Subject: bpf: allocate opcode table in struct bpf_cfg_in X-Git-Tag: v4.15.0~118 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=51be754690b8129e2116f9c8e7d4d88e2995fd03;p=thirdparty%2Fiproute2.git bpf: allocate opcode table in struct bpf_cfg_in struct bpf_cfg_in already carries a pointer to sock_filter ops. It's currently set to a local variable in bpf_parse_opt_tbl(), shared between parsing and loading stages. Move the array entirely to struct bpf_cfg_in, this will allow us to split parsing and loading. Signed-off-by: Jakub Kicinski Reviewed-by: Quentin Monnet Acked-by: Daniel Borkmann --- diff --git a/include/bpf_util.h b/include/bpf_util.h index a6f4eeb5f..638721f63 100644 --- a/include/bpf_util.h +++ b/include/bpf_util.h @@ -72,7 +72,7 @@ struct bpf_cfg_in { enum bpf_mode mode; int argc; char **argv; - struct sock_filter *ops; + struct sock_filter opcodes[BPF_MAXINSNS]; }; /* ALU ops on registers, bpf_add|sub|...: dst_reg += src_reg */ diff --git a/lib/bpf.c b/lib/bpf.c index 33c92d6c8..7493595ab 100644 --- a/lib/bpf.c +++ b/lib/bpf.c @@ -894,7 +894,7 @@ static int bpf_parse(struct bpf_cfg_in *cfg, const bool *opt_tbl) } if (cfg->mode == CBPF_BYTECODE || cfg->mode == CBPF_FILE) - ret = bpf_ops_parse(argc, argv, cfg->ops, + ret = bpf_ops_parse(argc, argv, cfg->opcodes, cfg->mode == CBPF_FILE); else if (cfg->mode == EBPF_OBJECT) ret = bpf_obj_open(file, cfg->type, section, verbose); @@ -916,18 +916,15 @@ static int bpf_parse_opt_tbl(struct bpf_cfg_in *cfg, const struct bpf_cfg_ops *ops, void *nl, const bool *opt_tbl) { - struct sock_filter opcodes[BPF_MAXINSNS]; char annotation[256]; int ret; - cfg->ops = opcodes; ret = bpf_parse(cfg, opt_tbl); - cfg->ops = NULL; if (ret < 0) return ret; if (cfg->mode == CBPF_BYTECODE || cfg->mode == CBPF_FILE) - ops->cbpf_cb(nl, opcodes, ret); + ops->cbpf_cb(nl, cfg->opcodes, ret); if (cfg->mode == EBPF_OBJECT || cfg->mode == EBPF_PINNED) { snprintf(annotation, sizeof(annotation), "%s:[%s]", basename(cfg->object), cfg->mode == EBPF_PINNED ?