diff options
author | Pablo Neira Ayuso <pablo@netfilter.org> | 2016-06-10 14:47:53 +0200 |
---|---|---|
committer | Pablo Neira Ayuso <pablo@netfilter.org> | 2016-06-15 13:26:21 +0200 |
commit | b674a8e78bf21985a05e17a3038f670bd8f46482 (patch) | |
tree | c7372a22e1bc682b8a9f31b63c9e3b6700f53e68 /src/set_elem.c | |
parent | 8f4de3888ce74607d4754fe5a1a8f470af409c09 (diff) |
src: check for strdup() errors from setters and parsers
And pass up an error to the caller.
Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
Diffstat (limited to 'src/set_elem.c')
-rw-r--r-- | src/set_elem.c | 14 |
1 files changed, 13 insertions, 1 deletions
diff --git a/src/set_elem.c b/src/set_elem.c index 7e3a995..1c8ea2b 100644 --- a/src/set_elem.c +++ b/src/set_elem.c @@ -118,6 +118,8 @@ int nftnl_set_elem_set(struct nftnl_set_elem *s, uint16_t attr, xfree(s->data.chain); s->data.chain = strdup(data); + if (!s->data.chain) + return -1; break; case NFTNL_SET_ELEM_DATA: /* NFTA_SET_ELEM_DATA */ memcpy(s->data.val, data, data_len); @@ -226,10 +228,16 @@ struct nftnl_set_elem *nftnl_set_elem_clone(struct nftnl_set_elem *elem) memcpy(newelem, elem, sizeof(*elem)); - if (elem->flags & (1 << NFTNL_SET_ELEM_CHAIN)) + if (elem->flags & (1 << NFTNL_SET_ELEM_CHAIN)) { newelem->data.chain = strdup(elem->data.chain); + if (!newelem->data.chain) + goto err; + } return newelem; +err: + nftnl_set_elem_free(newelem); + return NULL; } void nftnl_set_elem_nlmsg_build_payload(struct nlmsghdr *nlh, @@ -475,12 +483,16 @@ int nftnl_set_elems_nlmsg_parse(const struct nlmsghdr *nlh, struct nftnl_set *s) xfree(s->table); s->table = strdup(mnl_attr_get_str(tb[NFTA_SET_ELEM_LIST_TABLE])); + if (!s->table) + return -1; s->flags |= (1 << NFTNL_SET_TABLE); } if (tb[NFTA_SET_ELEM_LIST_SET]) { xfree(s->name); s->name = strdup(mnl_attr_get_str(tb[NFTA_SET_ELEM_LIST_SET])); + if (!s->name) + return -1; s->flags |= (1 << NFTNL_SET_NAME); } if (tb[NFTA_SET_ELEM_LIST_SET_ID]) { |