src: new error reporting approach for XML/JSON parsers
PATCH v2 1/1 src: new error reporting approach for XML/JSON parsers
From: Álvaro Neira Ayuso <[email protected]>
I have added a new structure for reporting some errors in parser that we can't cover with errno.
In this patch, we have three errors that we can't cover with errno:
NFT_PARSE_EBADINPUT : Bad XML/JSON format in the input NFT_PARSE_EMISSINGNODE : Missing node in our input NFT_PARSE_EBADTYPE : Wrong type value in a node
--- examples/nft-chain-json-add.c | 12 +++++ examples/nft-chain-xml-add.c | 12 +++++ examples/nft-rule-json-add.c | 12 +++++ examples/nft-rule-xml-add.c | 12 +++++ examples/nft-set-json-add.c | 13 +++++- examples/nft-table-json-add.c | 12 +++++ examples/nft-table-xml-add.c | 13 +++++- include/libnftables/chain.h | 3 + include/libnftables/common.h | 11 +++++ include/libnftables/rule.h | 3 + include/libnftables/ruleset.h | 3 + include/libnftables/set.h | 6 ++- include/libnftables/table.h | 3 + src/Makefile.am | 1 src/chain.c | 75 ++++++++++++++++++++-------------- src/common.c | 32 +++++++++++++++ src/expr/bitwise.c | 26 ++++++------ src/expr/byteorder.c | 27 +++++++----- src/expr/cmp.c | 20 +++++---- src/expr/counter.c | 16 +++++-- src/expr/ct.c | 19 +++++---- src/expr/data_reg.c | 54 ++++++++++++++----------- src/expr/data_reg.h | 6 ++- src/expr/exthdr.c | 23 ++++++---- src/expr/immediate.c | 14 ++++-- src/expr/limit.c | 17 +++++--- src/expr/log.c | 27 ++++++++---- src/expr/lookup.c | 18 +++++--- src/expr/match.c | 10 +++-- src/expr/meta.c | 14 ++++-- src/expr/nat.c | 30 +++++++------- src/expr/payload.c | 24 ++++++----- src/expr/reject.c | 16 +++++-- src/expr/target.c | 10 +++-- src/expr_ops.h | 6 ++- src/internal.h | 90 +++++++++++++++++++++++++++++------------ src/jansson.c | 83 ++++++++++++++++++++++++++------------ src/libnftables.map | 5 ++ src/mxml.c | 83 ++++++++++++++++++++++++++++---------- src/rule.c | 69 ++++++++++++++++++------------- src/ruleset.c | 72 +++++++++++++++++++-------------- src/set.c | 70 ++++++++++++++++++-------------- src/set_elem.c | 21 +++++----- src/table.c | 44 ++++++++++++-------- tests/nft-parsing-test.c | 39 +++++++++++------- 45 files changed, 761 insertions(+), 415 deletions(-)
examples/nft-chain-json-add.c +10 -2
@@ -39,6 +39,7 @@ int main(int argc, char *argv[])uint16_t family;char json[4096 ];char reprint[4096 ]; +struct nft_parse_err *err;if (argc <2 ) {printf ("Usage: %s <json-file>\n" , argv[0 ]);
@@ -63,10 +64,16 @@ int main(int argc, char *argv[])exit (EXIT_FAILURE ); } + err =nft_parse_err_alloc (); +if (err ==NULL ) { +perror ("error" ); +exit (EXIT_FAILURE ); + } +close (fd); -if (nft_chain_parse (c,NFT_PARSE_JSON , json) <0 ) { -printf ("E: Unable to parse JSON file: %s\n" ,strerror (errno)); +if (nft_chain_parse (c,NFT_PARSE_JSON , json, err) <0 ) { +nft_parse_perror ("Unable to parse JSON file" , err);exit (EXIT_FAILURE ); }
@@ -82,6 +89,7 @@ int main(int argc, char *argv[])nft_chain_nlmsg_build_payload (nlh, c);nft_chain_free (c); +nft_parse_err_free (err); nl =mnl_socket_open (NETLINK_NETFILTER );if (nl ==NULL ) {
examples/nft-chain-xml-add.c +10 -2
@@ -37,6 +37,7 @@ int main(int argc, char *argv[])uint16_t family;char xml[4096 ];char reprint[4096 ]; +struct nft_parse_err *err;if (argc <2 ) {printf ("Usage: %s <xml-file>\n" , argv[0 ]);
@@ -49,6 +50,12 @@ int main(int argc, char *argv[])exit (EXIT_FAILURE ); } + err =nft_parse_err_alloc (); +if (err ==NULL ) { +perror ("error" ); +exit (EXIT_FAILURE ); + } + fd =open (argv[1 ],O_RDONLY );if (fd <0 ) {perror ("open" );
@@ -63,8 +70,8 @@ int main(int argc, char *argv[])close (fd); -if (nft_chain_parse (c,NFT_PARSE_XML , xml) <0 ) { -printf ("E: Unable to parse XML file: %s\n" ,strerror (errno)); +if (nft_chain_parse (c,NFT_PARSE_XML , xml, err) <0 ) { +nft_parse_perror ("Unable to parse XML file" , err);exit (EXIT_FAILURE ); }
@@ -80,6 +87,7 @@ int main(int argc, char *argv[])nft_chain_nlmsg_build_payload (nlh, c);nft_chain_free (c); +nft_parse_err_free (err); nl =mnl_socket_open (NETLINK_NETFILTER );if (nl ==NULL ) {
examples/nft-rule-json-add.c +10 -2
@@ -38,6 +38,7 @@ int main(int argc, char *argv[])uint8_t family;char json[4096 ];char reprint[4096 ]; +struct nft_parse_err *err;if (argc <2 ) {printf ("Usage: %s <json-file>\n" , argv[0 ]);
@@ -63,8 +64,14 @@ int main(int argc, char *argv[])exit (EXIT_FAILURE ); } -if (nft_rule_parse (r,NFT_PARSE_JSON , json) <0 ) { -printf ("E: Unable to parse JSON file: %s\n" ,strerror (errno)); + err =nft_parse_err_alloc (); +if (err ==NULL ) { +perror ("error" ); +exit (EXIT_FAILURE ); + } + +if (nft_rule_parse (r,NFT_PARSE_JSON , json, err) <0 ) { +nft_parse_perror ("Unable to parse JSON file" , err);exit (EXIT_FAILURE ); }
@@ -80,6 +87,7 @@ int main(int argc, char *argv[]) seq);nft_rule_nlmsg_build_payload (nlh, r);nft_rule_free (r); +nft_parse_err_free (err); nl =mnl_socket_open (NETLINK_NETFILTER );if (nl ==NULL ) {
examples/nft-rule-xml-add.c +10 -2
@@ -38,6 +38,7 @@ int main(int argc, char *argv[])uint8_t family;char xml[4096 ];char reprint[4096 ]; +struct nft_parse_err *err;if (argc <2 ) {printf ("Usage: %s <xml-file>\n" , argv[0 ]);
@@ -63,8 +64,14 @@ int main(int argc, char *argv[])exit (EXIT_FAILURE ); } -if (nft_rule_parse (r,NFT_PARSE_XML , xml) <0 ) { -printf ("E: Unable to parse XML file: %s\n" ,strerror (errno)); + err =nft_parse_err_alloc (); +if (err ==NULL ) { +perror ("error" ); +exit (EXIT_FAILURE ); + } + +if (nft_rule_parse (r,NFT_PARSE_XML , xml, err) <0 ) { +nft_parse_perror ("Unable to parse XML file" , err);exit (EXIT_FAILURE ); }
@@ -80,6 +87,7 @@ int main(int argc, char *argv[]) seq);nft_rule_nlmsg_build_payload (nlh, r);nft_rule_free (r); +nft_parse_err_free (err); nl =mnl_socket_open (NETLINK_NETFILTER );if (nl ==NULL ) {
examples/nft-set-json-add.c +11 -2
@@ -38,6 +38,7 @@ int main(int argc, char *argv[])uint16_t family;char json[4096 ];char reprint[4096 ]; +struct nft_parse_err *err;if (argc <2 ) {printf ("Usage: %s <json-file>\n" , argv[0 ]);
@@ -62,10 +63,17 @@ int main(int argc, char *argv[])exit (EXIT_FAILURE ); } + err =nft_parse_err_alloc (); +if (err ==NULL ) { +perror ("error" ); +exit (EXIT_FAILURE ); + } + +close (fd); -if (nft_set_parse (s,NFT_PARSE_JSON , json) <0 ) { -printf ("E: Unable to parse JSON file: %s\n" ,strerror (errno)); +if (nft_set_parse (s,NFT_PARSE_JSON , json, err) <0 ) { +nft_parse_perror ("Unable to parse JSON file" , err);exit (EXIT_FAILURE ); }
@@ -80,6 +88,7 @@ int main(int argc, char *argv[]) NLM_F_CREATE|NLM_F_ACK, seq);nft_set_nlmsg_build_payload (nlh, s);nft_set_free (s); +nft_parse_err_free (err); nl =mnl_socket_open (NETLINK_NETFILTER );if (nl ==NULL ) {
examples/nft-table-json-add.c +10 -2
@@ -39,6 +39,7 @@ int main(int argc, char *argv[])uint16_t family;char json[4096 ];char reprint[4096 ]; +struct nft_parse_err *err;if (argc <2 ) {printf ("Usage: %s <json-file>\n" , argv[0 ]);
@@ -64,8 +65,14 @@ int main(int argc, char *argv[])exit (EXIT_FAILURE ); } -if (nft_table_parse (t,NFT_PARSE_JSON , json) <0 ) { -printf ("E: Unable to parse JSON file: %s\n" ,strerror (errno)); + err =nft_parse_err_alloc (); +if (err ==NULL ) { +perror ("error" ); +exit (EXIT_FAILURE ); + } + +if (nft_table_parse (t,NFT_PARSE_JSON , json, err) <0 ) { +nft_parse_perror ("Unable to parse JSON file" , err);exit (EXIT_FAILURE ); }
@@ -80,6 +87,7 @@ int main(int argc, char *argv[]) NLM_F_CREATE|NLM_F_ACK, seq);nft_table_nlmsg_build_payload (nlh, t);nft_table_free (t); +nft_parse_err_free (err); nl =mnl_socket_open (NETLINK_NETFILTER );if (nl ==NULL ) {
examples/nft-table-xml-add.c +11 -2
@@ -23,6 +23,7 @@#include <libmnl/libmnl.h> #include <libnftables/table.h> +#include <libnftables/common.h> int main (int argc,char *argv[]) {
@@ -35,6 +36,7 @@ int main(int argc, char *argv[])uint16_t family;char xml[4096 ];char reprint[4096 ]; +struct nft_parse_err *err;if (argc <2 ) {printf ("Usage: %s <xml-file>\n" , argv[0 ]);
@@ -60,8 +62,14 @@ int main(int argc, char *argv[])exit (EXIT_FAILURE ); } -if (nft_table_parse (t,NFT_PARSE_XML , xml) <0 ) { -printf ("E: Unable to parse XML file: %s\n" ,strerror (errno)); + err =nft_parse_err_alloc (); +if (err ==NULL ) { +perror ("error" ); +exit (EXIT_FAILURE ); + } + +if (nft_table_parse (t,NFT_PARSE_XML , xml, err) <0 ) { +nft_parse_perror ("Unable to parse XML file" , err);exit (EXIT_FAILURE ); }
@@ -76,6 +84,7 @@ int main(int argc, char *argv[]) NLM_F_CREATE|NLM_F_ACK, seq);nft_table_nlmsg_build_payload (nlh, t);nft_table_free (t); +nft_parse_err_free (err); nl =mnl_socket_open (NETLINK_NETFILTER );if (nl ==NULL ) {
include/libnftables/chain.h +2 -1
@@ -51,7 +51,8 @@ struct nlmsghdr;void nft_chain_nlmsg_build_payload (struct nlmsghdr *nlh,const struct nft_chain *t); -int nft_chain_parse (struct nft_chain *c,enum nft_parse_type type,const char *data); +int nft_chain_parse (struct nft_chain *c,enum nft_parse_type type, +const char *data,struct nft_parse_err *err);int nft_chain_snprintf (char *buf,size_t size,struct nft_chain *t,uint32_t type,uint32_t flags);int nft_chain_fprintf (FILE *fp,struct nft_chain *c,uint32_t type,uint32_t flags);
include/libnftables/common.h +11 -0
@@ -1,6 +1,12 @@#ifndef _LIBNFTABLES_COMMON_H_#define _LIBNFTABLES_COMMON_H_ +enum { +NFT_PARSE_EBADINPUT =0 , +NFT_PARSE_EMISSINGNODE , +NFT_PARSE_EBADTYPE , +}; +enum nft_output_type {NFT_OUTPUT_DEFAULT =0 , NFT_OUTPUT_XML,
@@ -14,7 +20,12 @@ enum nft_parse_type { NFT_PARSE_MAX, }; +struct nft_parse_err ; +struct nlmsghdr *nft_nlmsg_build_hdr (char *buf,uint16_t cmd,uint16_t family,uint16_t type,uint32_t seq); +struct nft_parse_err *nft_parse_err_alloc (void ); +void nft_parse_err_free (struct nft_parse_err *); +int nft_parse_perror (const char *str,struct nft_parse_err *err);#endif
include/libnftables/rule.h +2 -1
@@ -47,7 +47,8 @@ struct nlmsghdr;void nft_rule_nlmsg_build_payload (struct nlmsghdr *nlh,struct nft_rule *t); -int nft_rule_parse (struct nft_rule *r,enum nft_parse_type type,const char *data); +int nft_rule_parse (struct nft_rule *r,enum nft_parse_type type, +const char *data,struct nft_parse_err *err);int nft_rule_snprintf (char *buf,size_t size,struct nft_rule *t,uint32_t type,uint32_t flags);int nft_rule_fprintf (FILE *fp,struct nft_rule *r,uint32_t type,uint32_t flags);
include/libnftables/ruleset.h +2 -1
@@ -30,7 +30,8 @@ void nft_ruleset_attr_unset(struct nft_ruleset *r, uint16_t attr);void nft_ruleset_attr_set (struct nft_ruleset *r,uint16_t attr,void *data);const void *nft_ruleset_attr_get (const struct nft_ruleset *r,uint16_t attr); -int nft_ruleset_parse (struct nft_ruleset *rs,enum nft_parse_type type,const char *data); +int nft_ruleset_parse (struct nft_ruleset *rs,enum nft_parse_type type, +const char *data,struct nft_parse_err *err);int nft_ruleset_snprintf (char *buf,size_t size,const struct nft_ruleset *rs,uint32_t type,uint32_t flags);int nft_ruleset_fprintf (FILE *fp,const struct nft_ruleset *rs,uint32_t type,uint32_t flags);
include/libnftables/set.h +4 -2
@@ -60,7 +60,8 @@ struct nft_set *nft_set_list_iter_cur(struct nft_set_list_iter *iter);struct nft_set *nft_set_list_iter_next (struct nft_set_list_iter *iter);void nft_set_list_iter_destroy (struct nft_set_list_iter *iter); -int nft_set_parse (struct nft_set *s,enum nft_parse_type type,const char *data); +int nft_set_parse (struct nft_set *s,enum nft_parse_type type, +const char *data,struct nft_parse_err *err);/* * Set elements
@@ -98,7 +99,8 @@ void nft_set_elem_nlmsg_build_payload(struct nlmsghdr *nlh, struct nft_set_elemint nft_set_elem_nlmsg_parse (const struct nlmsghdr *nlh,struct nft_set_elem *s); -int nft_set_elem_parse (struct nft_set_elem *e,enum nft_parse_type type,const char *data); +int nft_set_elem_parse (struct nft_set_elem *e,enum nft_parse_type type, +const char *data,struct nft_parse_err *err);int nft_set_elem_snprintf (char *buf,size_t size,struct nft_set_elem *s,uint32_t type,uint32_t flags);int nft_set_elem_fprintf (FILE *fp,struct nft_set_elem *se,uint32_t type,uint32_t flags);
include/libnftables/table.h +2 -1
@@ -39,7 +39,8 @@ struct nlmsghdr;void nft_table_nlmsg_build_payload (struct nlmsghdr *nlh,const struct nft_table *t); -int nft_table_parse (struct nft_table *t,enum nft_parse_type type,const char *data); +int nft_table_parse (struct nft_table *t,enum nft_parse_type type, +const char *data,struct nft_parse_err *err);int nft_table_snprintf (char *buf,size_t size,struct nft_table *t,uint32_t type,uint32_t flags);int nft_table_fprintf (FILE *fp,struct nft_table *t,uint32_t type,uint32_t flags);
src/Makefile.am +1 -0
@@ -4,6 +4,7 @@ lib_LTLIBRARIES = libnftables.la libnftables_la_LIBADD = ${LIBMNL_LIBS} ${LIBXML_LIBS} ${LIBJSON_LIBS} libnftables_la_LDFLAGS = -Wl,--version-script=$(srcdir)/libnftables.map \ -version-info $(LIBVERSION) + libnftables_la_SOURCES = utils.c \ common.c \ table.c \
src/chain.c +43 -32
240 lines not on this page · raw message
src/common.c +32 -0
@@ -14,6 +14,7 @@#include <libnftables/common.h> #include "internal.h" +#include <stdlib.h> struct nlmsghdr *nft_nlmsg_build_hdr (char *buf,uint16_t cmd,uint16_t family,uint16_t type,uint32_t seq)
@@ -33,4 +34,35 @@ struct nlmsghdr *nft_nlmsg_build_hdr(char *buf, uint16_t cmd, uint16_t family,return nlh; } +EXPORT_SYMBOL (nft_nlmsg_build_hdr); + +struct nft_parse_err *nft_parse_err_alloc (void ) +{ +return calloc (1 ,sizeof (struct nft_parse_err )); +} +EXPORT_SYMBOL (nft_parse_err_alloc); + +void nft_parse_err_free (struct nft_parse_err *err) +{ +xfree (err); +} +EXPORT_SYMBOL (nft_parse_err_free); + +int nft_parse_perror (const char *str,struct nft_parse_err *err) +{ +switch (err->error) { +case NFT_PARSE_EBADINPUT : +return fprintf (stderr,"%s : Bad input format in line %d column %d\n" , + str, err->line, err->column); +case NFT_PARSE_EMISSINGNODE : +return fprintf (stderr,"%s : Node \"%s\" not found\n" , + str, err->node_name); +case NFT_PARSE_EBADTYPE : +return fprintf (stderr,"%s: Invalid type in node \"%s\"\n" , + str, err->node_name); +default : +return fprintf (stderr,"Undefined error\n" ); + } +} +EXPORT_SYMBOL (nft_parse_perror);
src/expr/bitwise.c +14 -12
@@ -181,35 +181,36 @@ nft_rule_expr_bitwise_parse(struct nft_rule_expr *e, struct nlattr *attr) }static int -nft_rule_expr_bitwise_json_parse (struct nft_rule_expr *e,json_t *root) +nft_rule_expr_bitwise_json_parse (struct nft_rule_expr *e,json_t *root, +struct nft_parse_err *err) {#ifdef JSON_PARSING struct nft_expr_bitwise *bitwise =nft_expr_data (e);uint32_t reg, len; -if (nft_jansson_parse_reg (root,"sreg" ,NFT_TYPE_U32 , ®) <0 ) +if (nft_jansson_parse_reg (root,"sreg" ,NFT_TYPE_U32 , ®, err) <0 )return -1 ;nft_rule_expr_set_u32 (e,NFT_EXPR_BITWISE_SREG , reg); -if (nft_jansson_parse_reg (root,"dreg" ,NFT_TYPE_U32 , ®) <0 ) +if (nft_jansson_parse_reg (root,"dreg" ,NFT_TYPE_U32 , ®, err) <0 )return -1 ;nft_rule_expr_set_u32 (e,NFT_EXPR_BITWISE_DREG , reg); -if (nft_jansson_parse_val (root,"len" ,NFT_TYPE_U32 , &len) <0 ) +if (nft_jansson_parse_val (root,"len" ,NFT_TYPE_U32 , &len, err) <0 )return -1 ;nft_rule_expr_set_u32 (e,NFT_EXPR_BITWISE_LEN , len);if (nft_jansson_data_reg_parse (root,"mask" , - &bitwise->mask) !=DATA_VALUE ) + &bitwise->mask, err) !=DATA_VALUE )return -1 ; e->flags |= (1 <<NFT_EXPR_BITWISE_MASK );if (nft_jansson_data_reg_parse (root,"xor" , - &bitwise->xor) !=DATA_VALUE ) + &bitwise->xor, err) !=DATA_VALUE )return -1 ; e->flags |= (1 <<NFT_EXPR_BITWISE_XOR );
@@ -225,20 +226,21 @@ nft_rule_expr_bitwise_json_parse(struct nft_rule_expr *e, json_t *root) }static int -nft_rule_expr_bitwise_xml_parse (struct nft_rule_expr *e,mxml_node_t *tree) +nft_rule_expr_bitwise_xml_parse (struct nft_rule_expr *e,mxml_node_t *tree, +struct nft_parse_err *err) {#ifdef XML_PARSING struct nft_expr_bitwise *bitwise =nft_expr_data (e);int32_t reg; - reg =nft_mxml_reg_parse (tree,"sreg" ,MXML_DESCEND_FIRST ); + reg =nft_mxml_reg_parse (tree,"sreg" ,MXML_DESCEND_FIRST , err);if (reg <0 )return -1 ; bitwise->sreg = reg; e->flags |= (1 <<NFT_EXPR_BITWISE_SREG ); - reg =nft_mxml_reg_parse (tree,"dreg" ,MXML_DESCEND ); + reg =nft_mxml_reg_parse (tree,"dreg" ,MXML_DESCEND , err);if (reg <0 )return -1 ;
@@ -247,19 +249,19 @@ nft_rule_expr_bitwise_xml_parse(struct nft_rule_expr *e, mxml_node_t *tree)if (nft_mxml_num_parse (tree,"len" ,MXML_DESCEND_FIRST ,BASE_DEC , &bitwise->len,NFT_TYPE_U8 , -NFT_XML_MAND ) !=0 ) +NFT_XML_MAND , err) !=0 )return -1 ; e->flags |= (1 <<NFT_EXPR_BITWISE_LEN );if (nft_mxml_data_reg_parse (tree,"mask" , &bitwise->mask, -NFT_XML_MAND ) !=DATA_VALUE ) +NFT_XML_MAND , err) !=DATA_VALUE )return -1 ; e->flags |= (1 <<NFT_EXPR_BITWISE_MASK );if (nft_mxml_data_reg_parse (tree,"xor" , &bitwise->xor, -NFT_XML_MAND ) !=DATA_VALUE ) +NFT_XML_MAND , err) !=DATA_VALUE )return -1 ; e->flags |= (1 <<NFT_EXPR_BITWISE_XOR );
src/expr/byteorder.c +15 -12
@@ -194,24 +194,25 @@ static inline int nft_str2ntoh(const char *op) }static int -nft_rule_expr_byteorder_json_parse (struct nft_rule_expr *e,json_t *root) +nft_rule_expr_byteorder_json_parse (struct nft_rule_expr *e,json_t *root, +struct nft_parse_err *err) {#ifdef JSON_PARSING const char *op;uint32_t uval32;int ntoh; -if (nft_jansson_parse_reg (root,"sreg" ,NFT_TYPE_U32 , &uval32) <0 ) +if (nft_jansson_parse_reg (root,"sreg" ,NFT_TYPE_U32 , &uval32, err) <0 )return -1 ;nft_rule_expr_set_u32 (e,NFT_EXPR_BYTEORDER_SREG , uval32); -if (nft_jansson_parse_reg (root,"dreg" ,NFT_TYPE_U32 , &uval32) <0 ) +if (nft_jansson_parse_reg (root,"dreg" ,NFT_TYPE_U32 , &uval32, err) <0 )return -1 ;nft_rule_expr_set_u32 (e,NFT_EXPR_BYTEORDER_DREG , uval32); - op =nft_jansson_parse_str (root,"op" ); + op =nft_jansson_parse_str (root,"op" , err);if (op ==NULL )return -1 ;
@@ -221,12 +222,12 @@ nft_rule_expr_byteorder_json_parse(struct nft_rule_expr *e, json_t *root)nft_rule_expr_set_u32 (e,NFT_EXPR_BYTEORDER_OP , ntoh); -if (nft_jansson_parse_val (root,"len" ,NFT_TYPE_U32 , &uval32) <0 ) +if (nft_jansson_parse_val (root,"len" ,NFT_TYPE_U32 , &uval32, err) <0 )return -1 ;nft_rule_expr_set_u32 (e,NFT_EXPR_BYTEORDER_LEN , uval32); -if (nft_jansson_parse_val (root,"size" ,NFT_TYPE_U32 , &uval32) <0 ) +if (nft_jansson_parse_val (root,"size" ,NFT_TYPE_U32 , &uval32, err) <0 )return -1 ;nft_rule_expr_set_u32 (e,NFT_EXPR_BYTEORDER_SIZE , uval32);
@@ -239,28 +240,30 @@ nft_rule_expr_byteorder_json_parse(struct nft_rule_expr *e, json_t *root) }static int -nft_rule_expr_byteorder_xml_parse (struct nft_rule_expr *e,mxml_node_t *tree) +nft_rule_expr_byteorder_xml_parse (struct nft_rule_expr *e,mxml_node_t *tree, +struct nft_parse_err *err) {#ifdef XML_PARSING struct nft_expr_byteorder *byteorder =nft_expr_data (e);const char *op;int32_t reg, ntoh; - reg =nft_mxml_reg_parse (tree,"sreg" ,MXML_DESCEND_FIRST ); + reg =nft_mxml_reg_parse (tree,"sreg" ,MXML_DESCEND_FIRST , err);if (reg <0 )return -1 ; byteorder->sreg = reg; e->flags |= (1 <<NFT_EXPR_BYTEORDER_SREG ); - reg =nft_mxml_reg_parse (tree,"dreg" ,MXML_DESCEND ); + reg =nft_mxml_reg_parse (tree,"dreg" ,MXML_DESCEND , err);if (reg <0 )return -1 ; byteorder->dreg = reg; e->flags |= (1 <<NFT_EXPR_BYTEORDER_DREG ); - op =nft_mxml_str_parse (tree,"op" ,MXML_DESCEND_FIRST ,NFT_XML_MAND ); + op =nft_mxml_str_parse (tree,"op" ,MXML_DESCEND_FIRST ,NFT_XML_MAND , + err);if (op ==NULL )return -1 ;
@@ -273,14 +276,14 @@ nft_rule_expr_byteorder_xml_parse(struct nft_rule_expr *e, mxml_node_t *tree)if (nft_mxml_num_parse (tree,"len" ,MXML_DESCEND_FIRST ,BASE_DEC , &byteorder->len,NFT_TYPE_U8 , -NFT_XML_MAND ) !=0 ) +NFT_XML_MAND , err) !=0 )return -1 ; e->flags |= (1 <<NFT_EXPR_BYTEORDER_LEN );if (nft_mxml_num_parse (tree,"size" ,MXML_DESCEND_FIRST ,BASE_DEC , &byteorder->size,NFT_TYPE_U8 , -NFT_XML_MAND ) !=0 ) +NFT_XML_MAND , err) !=0 )return -1 ; e->flags |= (1 <<NFT_EXPR_BYTEORDER_SIZE );
src/expr/cmp.c +12 -8
@@ -174,7 +174,8 @@ static inline int nft_str2cmp(const char *op) } } -static int nft_rule_expr_cmp_json_parse (struct nft_rule_expr *e,json_t *root) +static int nft_rule_expr_cmp_json_parse (struct nft_rule_expr *e,json_t *root, +struct nft_parse_err *err) {#ifdef JSON_PARSING struct nft_expr_cmp *cmp =nft_expr_data (e);
@@ -182,12 +183,12 @@ static int nft_rule_expr_cmp_json_parse(struct nft_rule_expr *e, json_t *root)uint32_t uval32;int base; -if (nft_jansson_parse_val (root,"sreg" ,NFT_TYPE_U32 , &uval32) <0 ) +if (nft_jansson_parse_val (root,"sreg" ,NFT_TYPE_U32 , &uval32, err) <0 )return -1 ;nft_rule_expr_set_u32 (e,NFT_EXPR_CMP_SREG , uval32); - op =nft_jansson_parse_str (root,"op" ); + op =nft_jansson_parse_str (root,"op" , err);if (op ==NULL )return -1 ;
@@ -198,7 +199,7 @@ static int nft_rule_expr_cmp_json_parse(struct nft_rule_expr *e, json_t *root)nft_rule_expr_set_u32 (e,NFT_EXPR_CMP_OP , base);if (nft_jansson_data_reg_parse (root,"cmpdata" , - &cmp->data) !=DATA_VALUE ) + &cmp->data, err) !=DATA_VALUE )return -1 ; e->flags |= (1 <<NFT_EXPR_CMP_DATA );
@@ -210,21 +211,23 @@ static int nft_rule_expr_cmp_json_parse(struct nft_rule_expr *e, json_t *root)#endif } -static int nft_rule_expr_cmp_xml_parse (struct nft_rule_expr *e,mxml_node_t *tree) +static int nft_rule_expr_cmp_xml_parse (struct nft_rule_expr *e,mxml_node_t *tree, +struct nft_parse_err *err) {#ifdef XML_PARSING struct nft_expr_cmp *cmp =nft_expr_data (e);const char *op;int32_t reg, op_value; - reg =nft_mxml_reg_parse (tree,"sreg" ,MXML_DESCEND_FIRST ); + reg =nft_mxml_reg_parse (tree,"sreg" ,MXML_DESCEND_FIRST , err);if (reg <0 )return -1 ; cmp->sreg = reg; e->flags |= (1 <<NFT_EXPR_CMP_SREG ); - op =nft_mxml_str_parse (tree,"op" ,MXML_DESCEND_FIRST ,NFT_XML_MAND ); + op =nft_mxml_str_parse (tree,"op" ,MXML_DESCEND_FIRST ,NFT_XML_MAND , + err);if (op ==NULL )return -1 ;
@@ -236,7 +239,8 @@ static int nft_rule_expr_cmp_xml_parse(struct nft_rule_expr *e, mxml_node_t *tre e->flags |= (1 <<NFT_EXPR_CMP_OP );if (nft_mxml_data_reg_parse (tree,"cmpdata" , - &cmp->data,NFT_XML_MAND ) !=DATA_VALUE ) + &cmp->data,NFT_XML_MAND , + err) !=DATA_VALUE )return -1 ; e->flags |= (1 <<NFT_EXPR_CMP_DATA );
src/expr/counter.c +10 -6
@@ -119,17 +119,18 @@ nft_rule_expr_counter_parse(struct nft_rule_expr *e, struct nlattr *attr) }static int -nft_rule_expr_counter_json_parse (struct nft_rule_expr *e,json_t *root) +nft_rule_expr_counter_json_parse (struct nft_rule_expr *e,json_t *root, +struct nft_parse_err *err) {#ifdef JSON_PARSING uint64_t uval64; -if (nft_jansson_parse_val (root,"pkts" ,NFT_TYPE_U64 , &uval64) <0 ) +if (nft_jansson_parse_val (root,"pkts" ,NFT_TYPE_U64 , &uval64, err) <0 )return -1 ;nft_rule_expr_set_u64 (e,NFT_EXPR_CTR_PACKETS , uval64); -if (nft_jansson_parse_val (root,"bytes" ,NFT_TYPE_U64 , &uval64) <0 ) +if (nft_jansson_parse_val (root,"bytes" ,NFT_TYPE_U64 , &uval64, err) <0 )return -1 ;nft_rule_expr_set_u64 (e,NFT_EXPR_CTR_BYTES , uval64);
@@ -142,19 +143,22 @@ nft_rule_expr_counter_json_parse(struct nft_rule_expr *e, json_t *root) }static int -nft_rule_expr_counter_xml_parse (struct nft_rule_expr *e,mxml_node_t *tree) +nft_rule_expr_counter_xml_parse (struct nft_rule_expr *e,mxml_node_t *tree, +struct nft_parse_err *err) {#ifdef XML_PARSING struct nft_expr_counter *ctr =nft_expr_data (e);if (nft_mxml_num_parse (tree,"pkts" ,MXML_DESCEND_FIRST ,BASE_DEC , - &ctr->pkts,NFT_TYPE_U64 ,NFT_XML_MAND ) !=0 ) + &ctr->pkts,NFT_TYPE_U64 ,NFT_XML_MAND , + err) !=0 )return -1 ; e->flags |= (1 <<NFT_EXPR_CTR_PACKETS );if (nft_mxml_num_parse (tree,"bytes" ,MXML_DESCEND_FIRST ,BASE_DEC , - &ctr->bytes,NFT_TYPE_U64 ,NFT_XML_MAND ) !=0 ) + &ctr->bytes,NFT_TYPE_U64 ,NFT_XML_MAND , + err) !=0 )return -1 ; e->flags |= (1 <<NFT_EXPR_CTR_BYTES );
src/expr/ct.c +11 -8
@@ -178,7 +178,8 @@ static inline int str2ctkey(const char *ctkey)return -1 ; } -static int nft_rule_expr_ct_json_parse (struct nft_rule_expr *e,json_t *root) +static int nft_rule_expr_ct_json_parse (struct nft_rule_expr *e,json_t *root, +struct nft_parse_err *err) {#ifdef JSON_PARSING const char *key_str;
@@ -186,13 +187,13 @@ static int nft_rule_expr_ct_json_parse(struct nft_rule_expr *e, json_t *root)uint8_t dir;int key; -if (nft_jansson_parse_reg (root,"dreg" ,NFT_TYPE_U32 , ®) <0 ) +if (nft_jansson_parse_reg (root,"dreg" ,NFT_TYPE_U32 , ®, err) <0 )return -1 ;nft_rule_expr_set_u32 (e,NFT_EXPR_CT_DREG , reg);if (nft_jansson_node_exist (root,"key" )) { - key_str =nft_jansson_parse_str (root,"key" ); + key_str =nft_jansson_parse_str (root,"key" , err);if (key_str ==NULL )return -1 ;
@@ -205,7 +206,8 @@ static int nft_rule_expr_ct_json_parse(struct nft_rule_expr *e, json_t *root) }if (nft_jansson_node_exist (root,"dir" )) { -if (nft_jansson_parse_val (root,"dir" ,NFT_TYPE_U8 , &dir) <0 ) +if (nft_jansson_parse_val (root,"dir" ,NFT_TYPE_U8 , &dir, + err) <0 )return -1 ;if (dir !=IP_CT_DIR_ORIGINAL && dir !=IP_CT_DIR_REPLY )
@@ -225,7 +227,8 @@ err: } -static int nft_rule_expr_ct_xml_parse (struct nft_rule_expr *e,mxml_node_t *tree) +static int nft_rule_expr_ct_xml_parse (struct nft_rule_expr *e,mxml_node_t *tree, +struct nft_parse_err *err) {#ifdef XML_PARSING struct nft_expr_ct *ct =nft_expr_data (e);
@@ -234,7 +237,7 @@ static int nft_rule_expr_ct_xml_parse(struct nft_rule_expr *e, mxml_node_t *treeint key;uint8_t dir; - reg =nft_mxml_reg_parse (tree,"dreg" ,MXML_DESCEND_FIRST ); + reg =nft_mxml_reg_parse (tree,"dreg" ,MXML_DESCEND_FIRST , err);if (reg <0 )return -1 ;
@@ -242,7 +245,7 @@ static int nft_rule_expr_ct_xml_parse(struct nft_rule_expr *e, mxml_node_t *tree e->flags |= (1 <<NFT_EXPR_CT_DREG ); key_str =nft_mxml_str_parse (tree,"key" ,MXML_DESCEND_FIRST , -NFT_XML_MAND ); +NFT_XML_MAND , err);if (key_str ==NULL )return -1 ;
@@ -254,7 +257,7 @@ static int nft_rule_expr_ct_xml_parse(struct nft_rule_expr *e, mxml_node_t *tree e->flags |= (1 <<NFT_EXPR_CT_KEY );if (nft_mxml_num_parse (tree,"dir" ,MXML_DESCEND_FIRST ,BASE_DEC , - &dir,NFT_TYPE_U8 ,NFT_XML_MAND ) !=0 ) + &dir,NFT_TYPE_U8 ,NFT_XML_MAND , err) !=0 )return -1 ;if (dir !=IP_CT_DIR_ORIGINAL && dir !=IP_CT_DIR_REPLY )
src/expr/data_reg.c +31 -23
158 lines not on this page · raw message
src/expr/data_reg.h +4 -2
@@ -29,8 +29,10 @@ union nft_data_reg {int nft_data_reg_snprintf (char *buf,size_t size,union nft_data_reg *reg,uint32_t output_format,uint32_t flags,int reg_type); -int nft_data_reg_xml_parse (union nft_data_reg *reg,mxml_node_t *tree); +int nft_data_reg_xml_parse (union nft_data_reg *reg,mxml_node_t *tree, +struct nft_parse_err *err);int nft_parse_data (union nft_data_reg *data,struct nlattr *attr,int *type); -int nft_data_reg_json_parse (union nft_data_reg *reg,json_t *data); +int nft_data_reg_json_parse (union nft_data_reg *reg,json_t *data, +struct nft_parse_err *err);#endif
src/expr/exthdr.c +13 -10
@@ -193,19 +193,20 @@ static inline int str2exthdr_type(const char *str) }static int -nft_rule_expr_exthdr_json_parse (struct nft_rule_expr *e,json_t *root) +nft_rule_expr_exthdr_json_parse (struct nft_rule_expr *e,json_t *root, +struct nft_parse_err *err) {#ifdef JSON_PARSING const char *exthdr_type;uint32_t uval32;int type; -if (nft_jansson_parse_reg (root,"dreg" ,NFT_TYPE_U32 , &uval32) <0 ) +if (nft_jansson_parse_reg (root,"dreg" ,NFT_TYPE_U32 , &uval32, err) <0 )return -1 ;nft_rule_expr_set_u32 (e,NFT_EXPR_EXTHDR_DREG , uval32); - exthdr_type =nft_jansson_parse_str (root,"exthdr_type" ); + exthdr_type =nft_jansson_parse_str (root,"exthdr_type" , err);if (exthdr_type ==NULL )return -1 ;
@@ -215,12 +216,12 @@ nft_rule_expr_exthdr_json_parse(struct nft_rule_expr *e, json_t *root)nft_rule_expr_set_u32 (e,NFT_EXPR_EXTHDR_TYPE , type); -if (nft_jansson_parse_val (root,"offset" ,NFT_TYPE_U32 , &uval32) <0 ) +if (nft_jansson_parse_val (root,"offset" ,NFT_TYPE_U32 , &uval32, err) <0 )return -1 ;nft_rule_expr_set_u32 (e,NFT_EXPR_EXTHDR_OFFSET , uval32); -if (nft_jansson_parse_val (root,"len" ,NFT_TYPE_U32 , &uval32) <0 ) +if (nft_jansson_parse_val (root,"len" ,NFT_TYPE_U32 , &uval32, err) <0 )return -1 ;nft_rule_expr_set_u32 (e,NFT_EXPR_EXTHDR_LEN , uval32);
@@ -233,7 +234,8 @@ nft_rule_expr_exthdr_json_parse(struct nft_rule_expr *e, json_t *root) }static int -nft_rule_expr_exthdr_xml_parse (struct nft_rule_expr *e,mxml_node_t *tree) +nft_rule_expr_exthdr_xml_parse (struct nft_rule_expr *e,mxml_node_t *tree, +struct nft_parse_err *err) {#ifdef XML_PARSING struct nft_expr_exthdr *exthdr =nft_expr_data (e);
@@ -241,7 +243,7 @@ nft_rule_expr_exthdr_xml_parse(struct nft_rule_expr *e, mxml_node_t *tree)int32_t reg;int type; - reg =nft_mxml_reg_parse (tree,"dreg" ,MXML_DESCEND_FIRST ); + reg =nft_mxml_reg_parse (tree,"dreg" ,MXML_DESCEND_FIRST , err);if (reg <0 )return -1 ;
@@ -249,7 +251,7 @@ nft_rule_expr_exthdr_xml_parse(struct nft_rule_expr *e, mxml_node_t *tree) e->flags |= (1 <<NFT_EXPR_EXTHDR_DREG ); exthdr_type =nft_mxml_str_parse (tree,"exthdr_type" , -MXML_DESCEND_FIRST ,NFT_XML_MAND ); +MXML_DESCEND_FIRST ,NFT_XML_MAND , err);if (exthdr_type ==NULL )return -1 ;
@@ -263,14 +265,15 @@ nft_rule_expr_exthdr_xml_parse(struct nft_rule_expr *e, mxml_node_t *tree)/* Get and set <offset> */ if (nft_mxml_num_parse (tree,"offset" ,MXML_DESCEND_FIRST ,BASE_DEC , &exthdr->offset,NFT_TYPE_U32 , -NFT_XML_MAND ) !=0 ) +NFT_XML_MAND , err) !=0 )return -1 ; e->flags |= (1 <<NFT_EXPR_EXTHDR_OFFSET );/* Get and set <len> */ if (nft_mxml_num_parse (tree,"len" ,MXML_DESCEND_FIRST ,BASE_DEC , - &exthdr->len,NFT_TYPE_U32 ,NFT_XML_MAND ) !=0 ) + &exthdr->len,NFT_TYPE_U32 ,NFT_XML_MAND , + err) !=0 )return -1 ; e->flags |= (1 <<NFT_EXPR_EXTHDR_LEN );
src/expr/immediate.c +8 -6
@@ -178,20 +178,21 @@ nft_rule_expr_immediate_parse(struct nft_rule_expr *e, struct nlattr *attr) }static int -nft_rule_expr_immediate_json_parse (struct nft_rule_expr *e,json_t *root) +nft_rule_expr_immediate_json_parse (struct nft_rule_expr *e,json_t *root, +struct nft_parse_err *err) {#ifdef JSON_PARSING struct nft_expr_immediate *imm =nft_expr_data (e);int datareg_type;uint32_t reg; -if (nft_jansson_parse_reg (root,"dreg" ,NFT_TYPE_U32 , ®) <0 ) +if (nft_jansson_parse_reg (root,"dreg" ,NFT_TYPE_U32 , ®, err) <0 )return -1 ;nft_rule_expr_set_u32 (e,NFT_EXPR_IMM_DREG , reg); datareg_type =nft_jansson_data_reg_parse (root,"immediatedata" , - &imm->data); + &imm->data, err);if (datareg_type <0 )return -1 ;
@@ -217,14 +218,15 @@ nft_rule_expr_immediate_json_parse(struct nft_rule_expr *e, json_t *root) }static int -nft_rule_expr_immediate_xml_parse (struct nft_rule_expr *e,mxml_node_t *tree) +nft_rule_expr_immediate_xml_parse (struct nft_rule_expr *e,mxml_node_t *tree, +struct nft_parse_err *err) {#ifdef XML_PARSING struct nft_expr_immediate *imm =nft_expr_data (e);int datareg_type;int32_t reg; - reg =nft_mxml_reg_parse (tree,"dreg" ,MXML_DESCEND_FIRST ); + reg =nft_mxml_reg_parse (tree,"dreg" ,MXML_DESCEND_FIRST , err);if (reg <0 )return -1 ;
@@ -232,7 +234,7 @@ nft_rule_expr_immediate_xml_parse(struct nft_rule_expr *e, mxml_node_t *tree) e->flags |= (1 <<NFT_EXPR_IMM_DREG ); datareg_type =nft_mxml_data_reg_parse (tree,"immediatedata" , - &imm->data,NFT_XML_MAND ); + &imm->data,NFT_XML_MAND , err);switch (datareg_type) {case DATA_VALUE : e->flags |= (1 <<NFT_EXPR_IMM_DATA );
src/expr/limit.c +11 -6
@@ -118,17 +118,18 @@ nft_rule_expr_limit_parse(struct nft_rule_expr *e, struct nlattr *attr)return 0 ; } -static int nft_rule_expr_limit_json_parse (struct nft_rule_expr *e,json_t *root) +static int nft_rule_expr_limit_json_parse (struct nft_rule_expr *e,json_t *root, +struct nft_parse_err *err) {#ifdef JSON_PARSING uint64_t uval64; -if (nft_jansson_parse_val (root,"rate" ,NFT_TYPE_U64 , &uval64) <0 ) +if (nft_jansson_parse_val (root,"rate" ,NFT_TYPE_U64 , &uval64, err) <0 )return -1 ;nft_rule_expr_set_u64 (e,NFT_EXPR_LIMIT_RATE , uval64); -if (nft_jansson_parse_val (root,"unit" ,NFT_TYPE_U64 , &uval64) <0 ) +if (nft_jansson_parse_val (root,"unit" ,NFT_TYPE_U64 , &uval64, err) <0 )return -1 ;nft_rule_expr_set_u64 (e,NFT_EXPR_LIMIT_UNIT , uval64);
@@ -140,19 +141,23 @@ static int nft_rule_expr_limit_json_parse(struct nft_rule_expr *e, json_t *root)#endif } -static int nft_rule_expr_limit_xml_parse (struct nft_rule_expr *e,mxml_node_t *tree) +static int nft_rule_expr_limit_xml_parse (struct nft_rule_expr *e, +mxml_node_t *tree, +struct nft_parse_err *err) {#ifdef XML_PARSING struct nft_expr_limit *limit =nft_expr_data (e);if (nft_mxml_num_parse (tree,"rate" ,MXML_DESCEND_FIRST ,BASE_DEC , - &limit->rate,NFT_TYPE_U64 ,NFT_XML_MAND ) !=0 ) + &limit->rate,NFT_TYPE_U64 ,NFT_XML_MAND , + err) !=0 )return -1 ; e->flags |= (1 <<NFT_EXPR_LIMIT_RATE );if (nft_mxml_num_parse (tree,"unit" ,MXML_DESCEND_FIRST ,BASE_DEC , - &limit->unit,NFT_TYPE_U64 ,NFT_XML_MAND ) !=0 ) + &limit->unit,NFT_TYPE_U64 ,NFT_XML_MAND , + err) !=0 )return -1 ; e->flags |= (1 <<NFT_EXPR_LIMIT_UNIT );
src/expr/log.c +17 -10
@@ -160,31 +160,34 @@ nft_rule_expr_log_parse(struct nft_rule_expr *e, struct nlattr *attr)return 0 ; } -static int nft_rule_expr_log_json_parse (struct nft_rule_expr *e,json_t *root) +static int nft_rule_expr_log_json_parse (struct nft_rule_expr *e,json_t *root, +struct nft_parse_err *err) {#ifdef JSON_PARSING const char *prefix;uint32_t snaplen;uint16_t uval16; - prefix =nft_jansson_parse_str (root,"prefix" ); + prefix =nft_jansson_parse_str (root,"prefix" , err);if (prefix ==NULL )return -1 ;nft_rule_expr_set_str (e,NFT_EXPR_LOG_PREFIX , prefix); -if (nft_jansson_parse_val (root,"group" ,NFT_TYPE_U16 , &uval16) <0 ) +if (nft_jansson_parse_val (root,"group" ,NFT_TYPE_U16 , &uval16, + err) <0 )return -1 ;nft_rule_expr_set_u16 (e,NFT_EXPR_LOG_GROUP , uval16); -if (nft_jansson_parse_val (root,"snaplen" ,NFT_TYPE_U32 , &snaplen) <0 ) +if (nft_jansson_parse_val (root,"snaplen" ,NFT_TYPE_U32 , &snaplen, + err) <0 )return -1 ;nft_rule_expr_set_u32 (e,NFT_EXPR_LOG_SNAPLEN , snaplen);if (nft_jansson_parse_val (root,"qthreshold" ,NFT_TYPE_U16 , - &uval16) <0 ) + &uval16, err) <0 )return -1 ;nft_rule_expr_set_u16 (e,NFT_EXPR_LOG_QTHRESHOLD , uval16);
@@ -196,14 +199,16 @@ static int nft_rule_expr_log_json_parse(struct nft_rule_expr *e, json_t *root)#endif } -static int nft_rule_expr_log_xml_parse (struct nft_rule_expr *e,mxml_node_t *tree) +static int nft_rule_expr_log_xml_parse (struct nft_rule_expr *e, +mxml_node_t *tree, +struct nft_parse_err *err) {#ifdef XML_PARSING struct nft_expr_log *log =nft_expr_data (e);const char *prefix; prefix =nft_mxml_str_parse (tree,"prefix" ,MXML_DESCEND_FIRST , -NFT_XML_MAND ); +NFT_XML_MAND , err);if (prefix ==NULL )return -1 ;
@@ -211,20 +216,22 @@ static int nft_rule_expr_log_xml_parse(struct nft_rule_expr *e, mxml_node_t *tre e->flags |= (1 <<NFT_EXPR_LOG_PREFIX );if (nft_mxml_num_parse (tree,"group" ,MXML_DESCEND_FIRST ,BASE_DEC , - &log->group,NFT_TYPE_U16 ,NFT_XML_MAND ) !=0 ) + &log->group,NFT_TYPE_U16 ,NFT_XML_MAND , + err) !=0 )return -1 ; e->flags |= (1 <<NFT_EXPR_LOG_GROUP );if (nft_mxml_num_parse (tree,"snaplen" ,MXML_DESCEND_FIRST ,BASE_DEC , - &log->snaplen,NFT_TYPE_U32 ,NFT_XML_MAND ) !=0 ) + &log->snaplen,NFT_TYPE_U32 ,NFT_XML_MAND , + err) !=0 )return -1 ; e->flags |= (1 <<NFT_EXPR_LOG_SNAPLEN );if (nft_mxml_num_parse (tree,"qthreshold" ,MXML_DESCEND_FIRST ,BASE_DEC , &log->qthreshold, -NFT_TYPE_U16 ,NFT_XML_MAND ) !=0 ) +NFT_TYPE_U16 ,NFT_XML_MAND , err) !=0 )return -1 ; e->flags |= (1 <<NFT_EXPR_LOG_QTHRESHOLD );
src/expr/lookup.c +10 -8
@@ -143,24 +143,25 @@ nft_rule_expr_lookup_parse(struct nft_rule_expr *e, struct nlattr *attr) }static int -nft_rule_expr_lookup_json_parse (struct nft_rule_expr *e,json_t *root) +nft_rule_expr_lookup_json_parse (struct nft_rule_expr *e,json_t *root, +struct nft_parse_err *err) {#ifdef JSON_PARSING const char *set_name;int32_t reg; - set_name =nft_jansson_parse_str (root,"set" ); + set_name =nft_jansson_parse_str (root,"set" , err);if (set_name ==NULL )return -1 ;nft_rule_expr_set_str (e,NFT_EXPR_LOOKUP_SET , set_name); -if (nft_jansson_parse_reg (root,"sreg" ,NFT_TYPE_U32 , ®) <0 ) +if (nft_jansson_parse_reg (root,"sreg" ,NFT_TYPE_U32 , ®, err) <0 )return -1 ;nft_rule_expr_set_u32 (e,NFT_EXPR_LOOKUP_SREG , reg); -if (nft_jansson_parse_reg (root,"dreg" ,NFT_TYPE_U32 , ®) <0 ) +if (nft_jansson_parse_reg (root,"dreg" ,NFT_TYPE_U32 , ®, err) <0 )return -1 ;nft_rule_expr_set_u32 (e,NFT_EXPR_LOOKUP_DREG , reg);
@@ -173,7 +174,8 @@ nft_rule_expr_lookup_json_parse(struct nft_rule_expr *e, json_t *root) }static int -nft_rule_expr_lookup_xml_parse (struct nft_rule_expr *e,mxml_node_t *tree) +nft_rule_expr_lookup_xml_parse (struct nft_rule_expr *e,mxml_node_t *tree, +struct nft_parse_err *err) {#ifdef XML_PARSING struct nft_expr_lookup *lookup =nft_expr_data (e);
@@ -181,7 +183,7 @@ nft_rule_expr_lookup_xml_parse(struct nft_rule_expr *e, mxml_node_t *tree)int32_t reg; set_name =nft_mxml_str_parse (tree,"set" ,MXML_DESCEND_FIRST , -NFT_XML_MAND ); +NFT_XML_MAND , err);if (set_name ==NULL )return -1 ;
@@ -189,14 +191,14 @@ nft_rule_expr_lookup_xml_parse(struct nft_rule_expr *e, mxml_node_t *tree) lookup->set_name[IFNAMSIZ -1 ] ='\0' ; e->flags |= (1 <<NFT_EXPR_LOOKUP_SET ); - reg =nft_mxml_reg_parse (tree,"sreg" ,MXML_DESCEND ); + reg =nft_mxml_reg_parse (tree,"sreg" ,MXML_DESCEND , err);if (reg <0 )return -1 ; lookup->sreg = reg; e->flags |= (1 <<NFT_EXPR_LOOKUP_SREG ); - reg =nft_mxml_reg_parse (tree,"dreg" ,MXML_DESCEND ); + reg =nft_mxml_reg_parse (tree,"dreg" ,MXML_DESCEND , err);if (reg <0 )return -1 ;
src/expr/match.c +6 -4
@@ -170,12 +170,13 @@ static int nft_rule_expr_match_parse(struct nft_rule_expr *e, struct nlattr *attreturn 0 ; } -static int nft_rule_expr_match_json_parse (struct nft_rule_expr *e,json_t *root) +static int nft_rule_expr_match_json_parse (struct nft_rule_expr *e,json_t *root, +struct nft_parse_err *err) {#ifdef JSON_PARSING const char *name; - name =nft_jansson_parse_str (root,"name" ); + name =nft_jansson_parse_str (root,"name" , err);if (name ==NULL )return -1 ;
@@ -189,14 +190,15 @@ static int nft_rule_expr_match_json_parse(struct nft_rule_expr *e, json_t *root) } -static int nft_rule_expr_match_xml_parse (struct nft_rule_expr *e,mxml_node_t *tree) +static int nft_rule_expr_match_xml_parse (struct nft_rule_expr *e,mxml_node_t *tree, +struct nft_parse_err *err) {#ifdef XML_PARSING struct nft_expr_match *mt =nft_expr_data (e);const char *name; name =nft_mxml_str_parse (tree,"name" ,MXML_DESCEND_FIRST , -NFT_XML_MAND ); +NFT_XML_MAND , err);if (name ==NULL )return -1 ;
src/expr/meta.c +8 -6
@@ -160,19 +160,20 @@ static inline int str2meta_key(const char *str)return -1 ; } -static int nft_rule_expr_meta_json_parse (struct nft_rule_expr *e,json_t *root) +static int nft_rule_expr_meta_json_parse (struct nft_rule_expr *e,json_t *root, +struct nft_parse_err *err) {#ifdef JSON_PARSING const char *key_str;uint32_t reg;int key; -if (nft_jansson_parse_reg (root,"dreg" ,NFT_TYPE_U32 , ®) <0 ) +if (nft_jansson_parse_reg (root,"dreg" ,NFT_TYPE_U32 , ®, err) <0 )return -1 ;nft_rule_expr_set_u32 (e,NFT_EXPR_META_DREG , reg); - key_str =nft_jansson_parse_str (root,"key" ); + key_str =nft_jansson_parse_str (root,"key" , err);if (key_str ==NULL )return -1 ;
@@ -190,7 +191,8 @@ static int nft_rule_expr_meta_json_parse(struct nft_rule_expr *e, json_t *root) } -static int nft_rule_expr_meta_xml_parse (struct nft_rule_expr *e,mxml_node_t *tree) +static int nft_rule_expr_meta_xml_parse (struct nft_rule_expr *e,mxml_node_t *tree, +struct nft_parse_err *err) {#ifdef XML_PARSING struct nft_expr_meta *meta =nft_expr_data (e);
@@ -198,7 +200,7 @@ static int nft_rule_expr_meta_xml_parse(struct nft_rule_expr *e, mxml_node_t *trint32_t reg;int key; - reg =nft_mxml_reg_parse (tree,"dreg" ,MXML_DESCEND_FIRST ); + reg =nft_mxml_reg_parse (tree,"dreg" ,MXML_DESCEND_FIRST , err);if (reg <0 )return -1 ;
@@ -206,7 +208,7 @@ static int nft_rule_expr_meta_xml_parse(struct nft_rule_expr *e, mxml_node_t *tr e->flags |= (1 <<NFT_EXPR_META_DREG ); key_str =nft_mxml_str_parse (tree,"key" ,MXML_DESCEND_FIRST , -NFT_XML_MAND ); +NFT_XML_MAND , err);if (key_str ==NULL )return -1 ;
src/expr/nat.c +16 -14
@@ -196,14 +196,15 @@ static inline int nft_str2nat(const char *nat) } } -static int nft_rule_expr_nat_json_parse (struct nft_rule_expr *e,json_t *root) +static int nft_rule_expr_nat_json_parse (struct nft_rule_expr *e,json_t *root, +struct nft_parse_err *err) {#ifdef JSON_PARSING const char *nat_type, *family_str;uint32_t reg;int val32; - nat_type =nft_jansson_parse_str (root,"nat_type" ); + nat_type =nft_jansson_parse_str (root,"nat_type" , err);if (nat_type ==NULL )return -1 ;
@@ -213,7 +214,7 @@ static int nft_rule_expr_nat_json_parse(struct nft_rule_expr *e, json_t *root)nft_rule_expr_set_u32 (e,NFT_EXPR_NAT_TYPE , val32); - family_str =nft_jansson_parse_str (root,"family" ); + family_str =nft_jansson_parse_str (root,"family" , err);if (family_str ==NULL )return -1 ;
@@ -224,25 +225,25 @@ static int nft_rule_expr_nat_json_parse(struct nft_rule_expr *e, json_t *root)nft_rule_expr_set_u32 (e,NFT_EXPR_NAT_FAMILY , val32);if (nft_jansson_parse_reg (root,"sreg_addr_min" ,NFT_TYPE_U32 , - ®) <0 ) + ®, err) <0 )return -1 ;nft_rule_expr_set_u32 (e,NFT_EXPR_NAT_REG_ADDR_MIN , reg);if (nft_jansson_parse_reg (root,"sreg_addr_max" ,NFT_TYPE_U32 , - ®) <0 ) + ®, err) <0 )return -1 ;nft_rule_expr_set_u32 (e,NFT_EXPR_NAT_REG_ADDR_MAX , reg);if (nft_jansson_parse_reg (root,"sreg_proto_min" ,NFT_TYPE_U32 , - ®) <0 ) + ®, err) <0 )return -1 ;nft_rule_expr_set_u32 (e,NFT_EXPR_NAT_REG_PROTO_MIN , reg);if (nft_jansson_parse_reg (root,"sreg_proto_max" ,NFT_TYPE_U32 , - ®) <0 ) + ®, err) <0 )return -1 ;nft_rule_expr_set_u32 (e,NFT_EXPR_NAT_REG_PROTO_MAX , reg);
@@ -254,7 +255,8 @@ static int nft_rule_expr_nat_json_parse(struct nft_rule_expr *e, json_t *root)#endif } -static int nft_rule_expr_nat_xml_parse (struct nft_rule_expr *e,mxml_node_t *tree) +static int nft_rule_expr_nat_xml_parse (struct nft_rule_expr *e,mxml_node_t *tree, +struct nft_parse_err *err) {#ifdef XML_PARSING struct nft_expr_nat *nat =nft_expr_data (e);
@@ -263,7 +265,7 @@ static int nft_rule_expr_nat_xml_parse(struct nft_rule_expr *e, mxml_node_t *treint family, nat_type_value; nat_type =nft_mxml_str_parse (tree,"type" ,MXML_DESCEND_FIRST , -NFT_XML_MAND ); +NFT_XML_MAND , err);if (nat_type ==NULL )return -1 ;
@@ -275,7 +277,7 @@ static int nft_rule_expr_nat_xml_parse(struct nft_rule_expr *e, mxml_node_t *tre e->flags |= (1 <<NFT_EXPR_NAT_TYPE ); family =nft_mxml_family_parse (tree,"family" ,MXML_DESCEND_FIRST , -NFT_XML_MAND ); +NFT_XML_MAND , err);if (family <0 ) {mxmlDelete (tree);return -1 ;
@@ -284,28 +286,28 @@ static int nft_rule_expr_nat_xml_parse(struct nft_rule_expr *e, mxml_node_t *tre nat->family = family; e->flags |= (1 <<NFT_EXPR_NAT_FAMILY ); - reg =nft_mxml_reg_parse (tree,"sreg_addr_min" ,MXML_DESCEND ); + reg =nft_mxml_reg_parse (tree,"sreg_addr_min" ,MXML_DESCEND , err);if (reg <0 )return -1 ; nat->sreg_addr_min = reg; e->flags |= (1 <<NFT_EXPR_NAT_REG_ADDR_MIN ); - reg =nft_mxml_reg_parse (tree,"sreg_addr_max" ,MXML_DESCEND ); + reg =nft_mxml_reg_parse (tree,"sreg_addr_max" ,MXML_DESCEND , err);if (reg <0 )return -1 ; nat->sreg_addr_max = reg; e->flags |= (1 <<NFT_EXPR_NAT_REG_ADDR_MAX ); - reg =nft_mxml_reg_parse (tree,"sreg_proto_min" ,MXML_DESCEND ); + reg =nft_mxml_reg_parse (tree,"sreg_proto_min" ,MXML_DESCEND , err);if (reg <0 )return -1 ; nat->sreg_proto_min = reg; e->flags |= (1 <<NFT_EXPR_NAT_REG_PROTO_MIN ); - reg =nft_mxml_reg_parse (tree,"sreg_proto_max" ,MXML_DESCEND ); + reg =nft_mxml_reg_parse (tree,"sreg_proto_max" ,MXML_DESCEND , err);if (reg <0 )return -1 ;
src/expr/payload.c +14 -10
@@ -194,19 +194,20 @@ static inline int nft_str2base(const char *base) }static int -nft_rule_expr_payload_json_parse (struct nft_rule_expr *e,json_t *root) +nft_rule_expr_payload_json_parse (struct nft_rule_expr *e,json_t *root, +struct nft_parse_err *err) {#ifdef JSON_PARSING const char *base_str;uint32_t reg, uval32;int base; -if (nft_jansson_parse_reg (root,"dreg" ,NFT_TYPE_U32 , ®) <0 ) +if (nft_jansson_parse_reg (root,"dreg" ,NFT_TYPE_U32 , ®, err) <0 )return -1 ;nft_rule_expr_set_u32 (e,NFT_EXPR_PAYLOAD_DREG , reg); - base_str =nft_jansson_parse_str (root,"base" ); + base_str =nft_jansson_parse_str (root,"base" , err);if (base_str ==NULL )return -1 ;
@@ -216,12 +217,13 @@ nft_rule_expr_payload_json_parse(struct nft_rule_expr *e, json_t *root)nft_rule_expr_set_u32 (e,NFT_EXPR_PAYLOAD_BASE , base); -if (nft_jansson_parse_val (root,"offset" ,NFT_TYPE_U32 , &uval32) <0 ) +if (nft_jansson_parse_val (root,"offset" ,NFT_TYPE_U32 , &uval32, + err) <0 )return -1 ;nft_rule_expr_set_u32 (e,NFT_EXPR_PAYLOAD_OFFSET , uval32); -if (nft_jansson_parse_val (root,"len" ,NFT_TYPE_U32 , &uval32) <0 ) +if (nft_jansson_parse_val (root,"len" ,NFT_TYPE_U32 , &uval32, err) <0 )return -1 ;nft_rule_expr_set_u32 (e,NFT_EXPR_PAYLOAD_LEN , uval32);
@@ -234,14 +236,15 @@ nft_rule_expr_payload_json_parse(struct nft_rule_expr *e, json_t *root) }static int -nft_rule_expr_payload_xml_parse (struct nft_rule_expr *e,mxml_node_t *tree) +nft_rule_expr_payload_xml_parse (struct nft_rule_expr *e,mxml_node_t *tree, +struct nft_parse_err *err) {#ifdef XML_PARSING struct nft_expr_payload *payload =nft_expr_data (e);const char *base_str;int32_t reg, base; - reg =nft_mxml_reg_parse (tree,"dreg" ,MXML_DESCEND_FIRST ); + reg =nft_mxml_reg_parse (tree,"dreg" ,MXML_DESCEND_FIRST , err);if (reg <0 )return -1 ;
@@ -249,7 +252,7 @@ nft_rule_expr_payload_xml_parse(struct nft_rule_expr *e, mxml_node_t *tree) e->flags |= (1 <<NFT_EXPR_PAYLOAD_DREG ); base_str =nft_mxml_str_parse (tree,"base" ,MXML_DESCEND_FIRST , -NFT_XML_MAND ); +NFT_XML_MAND , err);if (base_str ==NULL )return -1 ;
@@ -262,13 +265,14 @@ nft_rule_expr_payload_xml_parse(struct nft_rule_expr *e, mxml_node_t *tree)if (nft_mxml_num_parse (tree,"offset" ,MXML_DESCEND_FIRST ,BASE_DEC , &payload->offset,NFT_TYPE_U8 , -NFT_XML_MAND ) !=0 ) +NFT_XML_MAND , err) !=0 )return -1 ; e->flags |= (1 <<NFT_EXPR_PAYLOAD_OFFSET );if (nft_mxml_num_parse (tree,"len" ,MXML_DESCEND_FIRST ,BASE_DEC , - &payload->len,NFT_TYPE_U8 ,NFT_XML_MAND ) !=0 ) + &payload->len,NFT_TYPE_U8 , +NFT_XML_MAND , err) !=0 )return -1 ; e->flags |= (1 <<NFT_EXPR_PAYLOAD_LEN );
src/expr/reject.c +10 -6
@@ -122,18 +122,19 @@ nft_rule_expr_reject_parse(struct nft_rule_expr *e, struct nlattr *attr) }static int -nft_rule_expr_reject_json_parse (struct nft_rule_expr *e,json_t *root) +nft_rule_expr_reject_json_parse (struct nft_rule_expr *e,json_t *root, +struct nft_parse_err *err) {#ifdef JSON_PARSING uint32_t type;uint16_t code; -if (nft_jansson_parse_val (root,"type" ,NFT_TYPE_U32 , &type) <0 ) +if (nft_jansson_parse_val (root,"type" ,NFT_TYPE_U32 , &type, err) <0 )return -1 ;nft_rule_expr_set_u32 (e,NFT_EXPR_REJECT_TYPE , type); -if (nft_jansson_parse_val (root,"code" ,NFT_TYPE_U8 , &code) <0 ) +if (nft_jansson_parse_val (root,"code" ,NFT_TYPE_U8 , &code, err) <0 )return -1 ;nft_rule_expr_set_u8 (e,NFT_EXPR_REJECT_CODE , code);
@@ -146,19 +147,22 @@ nft_rule_expr_reject_json_parse(struct nft_rule_expr *e, json_t *root) }static int -nft_rule_expr_reject_xml_parse (struct nft_rule_expr *e,mxml_node_t *tree) +nft_rule_expr_reject_xml_parse (struct nft_rule_expr *e,mxml_node_t *tree, +struct nft_parse_err *err) {#ifdef XML_PARSING struct nft_expr_reject *reject =nft_expr_data (e);if (nft_mxml_num_parse (tree,"type" ,MXML_DESCEND_FIRST ,BASE_DEC , - &reject->type,NFT_TYPE_U32 ,NFT_XML_MAND ) !=0 ) + &reject->type,NFT_TYPE_U32 ,NFT_XML_MAND , + err) !=0 )return -1 ; e->flags |= (1 <<NFT_EXPR_REJECT_TYPE );if (nft_mxml_num_parse (tree,"code" ,MXML_DESCEND_FIRST ,BASE_DEC , - &reject->icmp_code,NFT_TYPE_U8 ,NFT_XML_MAND ) !=0 ) + &reject->icmp_code,NFT_TYPE_U8 ,NFT_XML_MAND , + err) !=0 )return -1 ; e->flags |= (1 <<NFT_EXPR_REJECT_CODE );
src/expr/target.c +6 -4
@@ -171,12 +171,13 @@ static int nft_rule_expr_target_parse(struct nft_rule_expr *e, struct nlattr *at }static int -nft_rule_expr_target_json_parse (struct nft_rule_expr *e,json_t *root) +nft_rule_expr_target_json_parse (struct nft_rule_expr *e,json_t *root, +struct nft_parse_err *err) {#ifdef JSON_PARSING const char *name; - name =nft_jansson_parse_str (root,"name" ); + name =nft_jansson_parse_str (root,"name" , err);if (name ==NULL )return -1 ;
@@ -190,14 +191,15 @@ nft_rule_expr_target_json_parse(struct nft_rule_expr *e, json_t *root) }static int -nft_rule_expr_target_xml_parse (struct nft_rule_expr *e,mxml_node_t *tree) +nft_rule_expr_target_xml_parse (struct nft_rule_expr *e,mxml_node_t *tree, +struct nft_parse_err *err) {#ifdef XML_PARSING struct nft_expr_target *tg =nft_expr_data (e);const char *name; name =nft_mxml_str_parse (tree,"name" ,MXML_DESCEND_FIRST , -NFT_XML_MAND ); +NFT_XML_MAND , err);if (name ==NULL )return -1 ;
src/expr_ops.h +4 -2
@@ -29,8 +29,10 @@ struct expr_ops {int (*parse)(struct nft_rule_expr *e,struct nlattr *attr);void (*build)(struct nlmsghdr *nlh,struct nft_rule_expr *e);int (*snprintf)(char *buf,size_t len,uint32_t type,uint32_t flags,struct nft_rule_expr *e); -int (*xml_parse)(struct nft_rule_expr *e,mxml_node_t *tree); -int (*json_parse)(struct nft_rule_expr *e,json_t *data); +int (*xml_parse)(struct nft_rule_expr *e,mxml_node_t *tree, +struct nft_parse_err *err); +int (*json_parse)(struct nft_rule_expr *e,json_t *data, +struct nft_parse_err *err); };void nft_expr_ops_register (struct expr_ops *ops);
src/internal.h +63 -27
128 lines not on this page · raw message
src/jansson.c +57 -26
242 lines not on this page · raw message
src/libnftables.map +5 -0
@@ -1,5 +1,10 @@ LIBNFTABLES_1.0 { global: + + nft_parse_err_alloc; + nft_parse_err_free; + nft_parse_perror; + nft_table_alloc; nft_table_free; nft_table_attr_is_set;
src/mxml.c +62 -21
190 lines not on this page · raw message
src/rule.c +40 -29
222 lines not on this page · raw message
src/ruleset.c +41 -31
223 lines not on this page · raw message
src/set.c +40 -30
181 lines not on this page · raw message
src/table.c +26 -18
44 lines not on this page · raw message
The rest of this diff is not shown. View the raw message.
--
To unsubscribe from this list: send the line "unsubscribe netfilter-devel" in the body of a message to [email protected]
More majordomo info at http://vger.kernel.org/majordomo-info.html
Part of the diff is not shown here. View the raw message.
Pablo Neira Ayuso
maintainerQuoted 10 lines · Alvaro Neira
From: Álvaro Neira Ayuso <[email protected]>
I have added a new structure for reporting some errors in parser that we can't cover with errno.
In this patch, we have three errors that we can't cover with errno:
NFT_PARSE_EBADINPUT: Bad XML/JSON format in the inputNFT_PARSE_EMISSINGNODE: Missing node in our inputNFT_PARSE_EBADTYPE: Wrong type value in a node
This looks good. Applied, thanks Alvaro.
--
To unsubscribe from this list: send the line "unsubscribe netfilter-devel" in the body of a message to [email protected]
More majordomo info at http://vger.kernel.org/majordomo-info.html
Quoted 6 lines · Pablo Neira Ayuso
Quoted 5 lines · Alvaro Neira
From: Álvaro Neira Ayuso <[email protected]>
I have added a new structure for reporting some errors in parser that we can't cover with errno.
Quoted 7 lines
Quoted 5 lines
In this patch, we have three errors that we can't cover with errno:
NFT_PARSE_EBADINPUT: Bad XML/JSON format in the inputNFT_PARSE_EMISSINGNODE: Missing node in our inputNFT_PARSE_EBADTYPE: Wrong type value in a nodeThis looks good. Applied, thanks Alvaro.
Hi Pablo,
I don't see this applied:
~/libnftables$ git pull --rebase
Current branch master is up to date.
~/libnftables$ gldoc
* b4a0d19 (HEAD, origin/master, origin/HEAD, master) src: rename the parameter tag to node_name in jansson function
* 24e08e5 build: properly handle --without-{xml,json}-parsing
* 2307124 include: update netlink.h to 3.13
[...]
Regards
Signature · 5 lines
Arturo Borrero González -- To unsubscribe from this list: send the line "unsubscribe netfilter-devel" in the body of a message to [email protected] More majordomo info at http://vger.kernel.org/majordomo-info.html
Pablo Neira Ayuso
maintainerQuoted 19 lines · Arturo Borrero Gonzalez
Quoted 6 lines · Pablo Neira Ayuso
Quoted 5 lines · Alvaro Neira
From: Álvaro Neira Ayuso <[email protected]>
I have added a new structure for reporting some errors in parser that we can't cover with errno.
Quoted 7 lines
Quoted 5 lines
In this patch, we have three errors that we can't cover with errno:
NFT_PARSE_EBADINPUT: Bad XML/JSON format in the inputNFT_PARSE_EMISSINGNODE: Missing node in our inputNFT_PARSE_EBADTYPE: Wrong type value in a nodeThis looks good. Applied, thanks Alvaro.
Hi Pablo,
I don't see this applied:
Quoted 8 lines
~/libnftables$ git pull --rebase
Current branch master is up to date.
~/libnftables$ gldoc
* b4a0d19 (HEAD, origin/master, origin/HEAD, master) src: rename the parameter tag tonode_namein jansson function
* 24e08e5 build: properly handle --without-{xml,json}-parsing
* 2307124 include: updatenetlink.hto 3.13
[...]
Forgot to push it, here it is:
http://git.netfilter.org/libnftables/commit/?id=e87d2f9ef8a4a298de5514b30ec2d43d3c90a644
--
To unsubscribe from this list: send the line "unsubscribe netfilter-devel" in the body of a message to [email protected]
More majordomo info at http://vger.kernel.org/majordomo-info.html