summaryrefslogtreecommitdiffstats
path: root/src/expr/bitwise.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/expr/bitwise.c')
-rw-r--r--src/expr/bitwise.c62
1 files changed, 12 insertions, 50 deletions
diff --git a/src/expr/bitwise.c b/src/expr/bitwise.c
index 6843086..4b48392 100644
--- a/src/expr/bitwise.c
+++ b/src/expr/bitwise.c
@@ -198,69 +198,42 @@ nft_rule_expr_bitwise_parse(struct nft_rule_expr *e, struct nlattr *attr)
}
static int
-nft_rule_expr_bitwise_xml_parse(struct nft_rule_expr *e, char *xml)
+nft_rule_expr_bitwise_xml_parse(struct nft_rule_expr *e, mxml_node_t *tree)
{
#ifdef XML_PARSING
struct nft_expr_bitwise *bitwise = (struct nft_expr_bitwise *)e->data;
- mxml_node_t *tree = NULL;
mxml_node_t *node = NULL;
mxml_node_t *save = NULL;
uint64_t tmp;
union nft_data_reg data_regtmp;
char *endptr = NULL;
- tree = mxmlLoadString(NULL, xml, MXML_OPAQUE_CALLBACK);
- if (tree == NULL)
- return -1;
-
- if (mxmlElementGetAttr(tree, "type") == NULL) {
- mxmlDelete(tree);
- return -1;
- }
-
- if (strcmp("bitwise", mxmlElementGetAttr(tree, "type")) != 0) {
- mxmlDelete(tree);
- return -1;
- }
-
/* get and set <sreg> */
node = mxmlFindElement(tree, tree, "sreg", NULL, NULL,
MXML_DESCEND_FIRST);
- if (node == NULL) {
- mxmlDelete(tree);
+ if (node == NULL)
return -1;
- }
tmp = strtoull(node->child->value.opaque, &endptr, 10);
- if (tmp > UINT32_MAX || tmp < 0 || *endptr) {
- mxmlDelete(tree);
+ if (tmp > UINT32_MAX || tmp < 0 || *endptr)
return -1;
- }
- if (tmp > NFT_REG_MAX) {
- mxmlDelete(tree);
+ if (tmp > NFT_REG_MAX)
return -1;
- }
bitwise->sreg = (uint32_t)tmp;
e->flags |= (1 << NFT_EXPR_BITWISE_SREG);
/* get and set <dreg> */
node = mxmlFindElement(tree, tree, "dreg", NULL, NULL, MXML_DESCEND);
- if (node == NULL) {
- mxmlDelete(tree);
+ if (node == NULL)
return -1;
- }
tmp = strtoull(node->child->value.opaque, &endptr, 10);
- if (tmp > UINT32_MAX || tmp < 0 || *endptr) {
- mxmlDelete(tree);
+ if (tmp > UINT32_MAX || tmp < 0 || *endptr)
return -1;
- }
- if (tmp > NFT_REG_MAX) {
- mxmlDelete(tree);
+ if (tmp > NFT_REG_MAX)
return -1;
- }
bitwise->dreg = (uint32_t)tmp;
e->flags |= (1 << NFT_EXPR_BITWISE_DREG);
@@ -268,19 +241,15 @@ nft_rule_expr_bitwise_xml_parse(struct nft_rule_expr *e, char *xml)
/* Get and set <mask> */
node = mxmlFindElement(tree, tree, "mask", NULL, NULL,
MXML_DESCEND);
- if (node == NULL) {
- mxmlDelete(tree);
+ if (node == NULL)
return -1;
- }
/* hack for mxmSaveAllocString to print just the current node */
save = node->next;
node->next = NULL;
if (nft_data_reg_xml_parse(&data_regtmp,
- mxmlSaveAllocString(node, MXML_NO_CALLBACK)) < 0) {
- mxmlDelete(tree);
+ mxmlSaveAllocString(node, MXML_NO_CALLBACK)) < 0)
return -1;
- }
node->next = save;
memcpy(&bitwise->mask.val, data_regtmp.val, data_regtmp.len);
@@ -290,19 +259,15 @@ nft_rule_expr_bitwise_xml_parse(struct nft_rule_expr *e, char *xml)
/* Get and set <xor> */
node = mxmlFindElement(tree, tree, "xor", NULL, NULL,
MXML_DESCEND);
- if (node == NULL) {
- mxmlDelete(tree);
+ if (node == NULL)
return -1;
- }
/* hack for mxmSaveAllocString to print just the current node */
save = node->next;
node->next = NULL;
if (nft_data_reg_xml_parse(&data_regtmp,
- mxmlSaveAllocString(node, MXML_NO_CALLBACK)) < 0) {
- mxmlDelete(tree);
+ mxmlSaveAllocString(node, MXML_NO_CALLBACK)) < 0)
return -1;
- }
memcpy(&bitwise->xor.val, data_regtmp.val, data_regtmp.len);
bitwise->xor.len = data_regtmp.len;
@@ -311,12 +276,9 @@ nft_rule_expr_bitwise_xml_parse(struct nft_rule_expr *e, char *xml)
/* Additional validation: mask and xor must use the same number of
* data registers.
*/
- if (bitwise->mask.len != bitwise->xor.len) {
- mxmlDelete(tree);
+ if (bitwise->mask.len != bitwise->xor.len)
return -1;
- }
- mxmlDelete(tree);
return 0;
#else
errno = EOPNOTSUPP;