From e4206c8c5b2cfe9dcdf92d3f0379414909dff299 Mon Sep 17 00:00:00 2001 From: Pablo Neira Ayuso Date: Thu, 25 Jul 2013 23:22:26 +0200 Subject: table: json: fix returned errno value while parsing Instead of returning ERANGE all the time, let functions set errno accordingly and set EINVAL otherwise. Signed-off-by: Pablo Neira Ayuso --- src/jansson.c | 17 ++++++----------- src/table.c | 24 ++++++++++++++---------- 2 files changed, 20 insertions(+), 21 deletions(-) (limited to 'src') diff --git a/src/jansson.c b/src/jansson.c index 2b15240..cc68ae0 100644 --- a/src/jansson.c +++ b/src/jansson.c @@ -31,14 +31,11 @@ static int nft_jansson_load_int_node(json_t *root, const char *tag, if (!json_is_integer(node)) { errno = ERANGE; - goto err; + return -1; } - *val = json_integer_value(node); return 0; -err: - return -1; } const char *nft_jansson_value_parse_str(json_t *root, const char *tag) @@ -47,9 +44,10 @@ const char *nft_jansson_value_parse_str(json_t *root, const char *tag) const char *val; node = json_object_get(root, tag); - if (node == NULL) + if (node == NULL) { + errno = EINVAL; return NULL; - + } val = json_string_value(node); return val; @@ -61,15 +59,12 @@ int nft_jansson_value_parse_val(json_t *root, const char *tag, int type, json_int_t val; if (nft_jansson_load_int_node(root, tag, &val) == -1) - goto err; + return -1; if (nft_get_value(type, &val, out) == -1) - goto err; + return -1; return 0; -err: - errno = ERANGE; - return -1; } bool nft_jansson_node_exist(json_t *root, const char *tag) diff --git a/src/table.c b/src/table.c index 65797e8..1d17d3b 100644 --- a/src/table.c +++ b/src/table.c @@ -302,26 +302,29 @@ static int nft_table_json_parse(struct nft_table *t, char *json) json_error_t error; uint64_t version; uint32_t table_flag; - const char *str = NULL; + const char *str; + int family; root = json_loadb(json, strlen(json), 0, &error); if (!root) { errno = EINVAL; - return -1; + goto err; } root = json_object_get(root, "table"); if (root == NULL) { - errno = ERANGE; - return -1; + errno = EINVAL; + goto err; } if (nft_jansson_value_parse_val(root, "version", NFT_TYPE_U64, &version) == -1) goto err; - if (version != NFT_TABLE_JSON_VERSION || version == -1) + if (version != NFT_TABLE_JSON_VERSION) { + errno = EINVAL; goto err; + } str = nft_jansson_value_parse_str(root, "name"); if (str == NULL) @@ -330,17 +333,20 @@ static int nft_table_json_parse(struct nft_table *t, char *json) nft_table_attr_set_str(t, NFT_TABLE_ATTR_NAME, strdup(str)); root = json_object_get(root, "properties"); - if (root == NULL) + if (root == NULL) { + errno = EINVAL; goto err; + } str = nft_jansson_value_parse_str(root, "family"); if (str == NULL) goto err; - if (nft_str2family(str) < 0) + family = nft_str2family(str); + if (family < 0) goto err; - nft_table_attr_set_u32(t, NFT_TABLE_ATTR_FAMILY, nft_str2family(str)); + nft_table_attr_set_u32(t, NFT_TABLE_ATTR_FAMILY, family); if (nft_jansson_value_parse_val(root, "table_flags", NFT_TYPE_U32, &table_flag) == -1) @@ -352,9 +358,7 @@ static int nft_table_json_parse(struct nft_table *t, char *json) return 0; err: free(root); - errno = ERANGE; return -1; - #else errno = EOPNOTSUPP; return -1; -- cgit v1.2.3