* [PATCH 1/2 libnftnl] set_elem: Copy user data memory @ 2016-05-27 14:56 Carlos Falgueras García 2016-05-27 14:56 ` [PATCH 2/2 nft] set_elem: Use libnftnl/udata to store set element comment Carlos Falgueras García 2016-05-30 9:46 ` [PATCH 1/2 libnftnl] set_elem: Copy user data memory Pablo Neira Ayuso 0 siblings, 2 replies; 4+ messages in thread From: Carlos Falgueras García @ 2016-05-27 14:56 UTC (permalink / raw) To: netfilter-devel; +Cc: pablo All attributes are passed by copy, so user data should be copied too. Signed-off-by: Carlos Falgueras García <carlosfg@riseup.net> --- src/set_elem.c | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/src/set_elem.c b/src/set_elem.c index 990be24..b9c7e1e 100644 --- a/src/set_elem.c +++ b/src/set_elem.c @@ -125,8 +125,14 @@ void nftnl_set_elem_set(struct nftnl_set_elem *s, uint16_t attr, s->timeout = *((uint64_t *)data); break; case NFTNL_SET_ELEM_USERDATA: /* NFTA_SET_ELEM_USERDATA */ - s->user.data = (void *)data; - s->user.len = data_len; + if (s->user.data != NULL) + xfree(s->user.data); + + s->user.data = malloc(data_len); + if (!s->user.data) + return; + memcpy(s->user.data, data, data_len); + s->user.len = data_len; break; default: return; -- 2.8.2 -- To unsubscribe from this list: send the line "unsubscribe netfilter-devel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html ^ permalink raw reply related [flat|nested] 4+ messages in thread
* [PATCH 2/2 nft] set_elem: Use libnftnl/udata to store set element comment 2016-05-27 14:56 [PATCH 1/2 libnftnl] set_elem: Copy user data memory Carlos Falgueras García @ 2016-05-27 14:56 ` Carlos Falgueras García 2016-05-30 9:47 ` Pablo Neira Ayuso 2016-05-30 9:46 ` [PATCH 1/2 libnftnl] set_elem: Copy user data memory Pablo Neira Ayuso 1 sibling, 1 reply; 4+ messages in thread From: Carlos Falgueras García @ 2016-05-27 14:56 UTC (permalink / raw) To: netfilter-devel; +Cc: pablo The set element comment is stored in nftnl_set_elem->user.data using libnftnl/udata infrastructure. This allows store multiple variable length user data into set element. Signed-off-by: Carlos Falgueras García <carlosfg@riseup.net> --- src/netlink.c | 50 ++++++++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 46 insertions(+), 4 deletions(-) diff --git a/src/netlink.c b/src/netlink.c index b0dcb90..f82d4fa 100644 --- a/src/netlink.c +++ b/src/netlink.c @@ -22,6 +22,7 @@ #include <libnftnl/chain.h> #include <libnftnl/expr.h> #include <libnftnl/set.h> +#include <libnftnl/udata.h> #include <libnftnl/common.h> #include <linux/netfilter/nfnetlink.h> #include <linux/netfilter/nf_tables.h> @@ -208,6 +209,7 @@ static struct nftnl_set_elem *alloc_nftnl_setelem(const struct expr *expr) const struct expr *elem, *key, *data; struct nftnl_set_elem *nlse; struct nft_data_linearize nld; + struct nftnl_udata_buf *udbuf; nlse = nftnl_set_elem_alloc(); if (nlse == NULL) @@ -228,9 +230,18 @@ static struct nftnl_set_elem *alloc_nftnl_setelem(const struct expr *expr) if (elem->timeout) nftnl_set_elem_set_u64(nlse, NFTNL_SET_ELEM_TIMEOUT, elem->timeout); - if (elem->comment) + if (elem->comment) { + udbuf = nftnl_udata_buf_alloc(NFT_USERDATA_MAXLEN); + if (!udbuf) + memory_allocation_error(); + if (!nftnl_udata_put_strz(udbuf, UDATA_TYPE_COMMENT, + elem->comment)) + memory_allocation_error(); nftnl_set_elem_set(nlse, NFTNL_SET_ELEM_USERDATA, - elem->comment, strlen(elem->comment) + 1); + nftnl_udata_buf_data(udbuf), + nftnl_udata_buf_len(udbuf)); + nftnl_udata_buf_free(udbuf); + } if (data != NULL) { netlink_gen_data(data, &nld); @@ -1421,6 +1432,38 @@ static struct expr *netlink_parse_concat_elem(const struct datatype *dtype, return concat; } +static int parse_udata_cb(const struct nftnl_udata *attr, void *data) +{ + unsigned char *value = nftnl_udata_get(attr); + uint8_t type = nftnl_udata_type(attr); + uint8_t len = nftnl_udata_len(attr); + const struct nftnl_udata **tb = data; + + switch (type) { + case UDATA_TYPE_COMMENT: + if (value[len - 1] != '\0') + return -1; + break; + default: + return 0; + } + tb[type] = attr; + return 0; +} + +static char *udata_get_comment(const void *data, uint32_t data_len) +{ + const struct nftnl_udata *tb[UDATA_TYPE_MAX + 1] = {}; + + if (nftnl_udata_parse(data, data_len, parse_udata_cb, tb) < 0) + return NULL; + + if (!tb[UDATA_TYPE_COMMENT]) + return NULL; + + return xstrdup(nftnl_udata_get(tb[UDATA_TYPE_COMMENT])); +} + static int netlink_delinearize_setelem(struct nftnl_set_elem *nlse, const struct set *set) { @@ -1457,8 +1500,7 @@ static int netlink_delinearize_setelem(struct nftnl_set_elem *nlse, uint32_t len; data = nftnl_set_elem_get(nlse, NFTNL_SET_ELEM_USERDATA, &len); - expr->comment = xmalloc(len); - memcpy((char *)expr->comment, data, len); + expr->comment = udata_get_comment(data, len); } if (nftnl_set_elem_is_set(nlse, NFT_SET_ELEM_ATTR_EXPR)) { const struct nftnl_expr *nle; -- 2.8.2 -- To unsubscribe from this list: send the line "unsubscribe netfilter-devel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html ^ permalink raw reply related [flat|nested] 4+ messages in thread
* Re: [PATCH 2/2 nft] set_elem: Use libnftnl/udata to store set element comment 2016-05-27 14:56 ` [PATCH 2/2 nft] set_elem: Use libnftnl/udata to store set element comment Carlos Falgueras García @ 2016-05-30 9:47 ` Pablo Neira Ayuso 0 siblings, 0 replies; 4+ messages in thread From: Pablo Neira Ayuso @ 2016-05-30 9:47 UTC (permalink / raw) To: Carlos Falgueras García; +Cc: netfilter-devel On Fri, May 27, 2016 at 04:56:55PM +0200, Carlos Falgueras García wrote: > The set element comment is stored in nftnl_set_elem->user.data using > libnftnl/udata infrastructure. This allows store multiple variable length > user data into set element. Applied, thanks. -- To unsubscribe from this list: send the line "unsubscribe netfilter-devel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html ^ permalink raw reply [flat|nested] 4+ messages in thread
* Re: [PATCH 1/2 libnftnl] set_elem: Copy user data memory 2016-05-27 14:56 [PATCH 1/2 libnftnl] set_elem: Copy user data memory Carlos Falgueras García 2016-05-27 14:56 ` [PATCH 2/2 nft] set_elem: Use libnftnl/udata to store set element comment Carlos Falgueras García @ 2016-05-30 9:46 ` Pablo Neira Ayuso 1 sibling, 0 replies; 4+ messages in thread From: Pablo Neira Ayuso @ 2016-05-30 9:46 UTC (permalink / raw) To: Carlos Falgueras García; +Cc: netfilter-devel On Fri, May 27, 2016 at 04:56:54PM +0200, Carlos Falgueras García wrote: > All attributes are passed by copy, so user data should be copied too. Applied, thanks. -- To unsubscribe from this list: send the line "unsubscribe netfilter-devel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html ^ permalink raw reply [flat|nested] 4+ messages in thread
end of thread, other threads:[~2016-05-30 9:47 UTC | newest] Thread overview: 4+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2016-05-27 14:56 [PATCH 1/2 libnftnl] set_elem: Copy user data memory Carlos Falgueras García 2016-05-27 14:56 ` [PATCH 2/2 nft] set_elem: Use libnftnl/udata to store set element comment Carlos Falgueras García 2016-05-30 9:47 ` Pablo Neira Ayuso 2016-05-30 9:46 ` [PATCH 1/2 libnftnl] set_elem: Copy user data memory Pablo Neira Ayuso
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for NNTP newsgroup(s).