diff options
-rw-r--r-- | src/cache.c | 1 | ||||
-rw-r--r-- | src/monitor.c | 5 | ||||
-rw-r--r-- | src/netlink_delinearize.c | 5 |
3 files changed, 10 insertions, 1 deletions
diff --git a/src/cache.c b/src/cache.c index f790f995..85de970f 100644 --- a/src/cache.c +++ b/src/cache.c @@ -598,6 +598,7 @@ static int list_rule_cb(struct nftnl_rule *nlr, void *data) netlink_dump_rule(nlr, ctx); rule = netlink_delinearize_rule(ctx, nlr); + assert(rule); list_add_tail(&rule->list, &ctx->list); return 0; diff --git a/src/monitor.c b/src/monitor.c index 7fa92ebf..a6b30a18 100644 --- a/src/monitor.c +++ b/src/monitor.c @@ -551,6 +551,10 @@ static int netlink_events_rule_cb(const struct nlmsghdr *nlh, int type, nlr = netlink_rule_alloc(nlh); r = netlink_delinearize_rule(monh->ctx, nlr); + if (!r) { + fprintf(stderr, "W: Received event for an unknown table.\n"); + goto out_free_nlr; + } nlr_for_each_set(nlr, rule_map_decompose_cb, NULL, &monh->ctx->nft->cache); cmd = netlink_msg2cmd(type, nlh->nlmsg_flags); @@ -587,6 +591,7 @@ static int netlink_events_rule_cb(const struct nlmsghdr *nlh, int type, break; } rule_free(r); +out_free_nlr: nftnl_rule_free(nlr); return MNL_CB_OK; } diff --git a/src/netlink_delinearize.c b/src/netlink_delinearize.c index 0da6cc78..e8b9724c 100644 --- a/src/netlink_delinearize.c +++ b/src/netlink_delinearize.c @@ -3195,7 +3195,10 @@ struct rule *netlink_delinearize_rule(struct netlink_ctx *ctx, pctx->rule = rule_alloc(&netlink_location, &h); pctx->table = table_cache_find(&ctx->nft->cache.table_cache, h.table.name, h.family); - assert(pctx->table != NULL); + if (!pctx->table) { + errno = ENOENT; + return NULL; + } pctx->rule->comment = nftnl_rule_get_comment(nlr); |