diff options
author | Phil Sutter <phil@nwl.cc> | 2018-08-29 16:23:24 +0200 |
---|---|---|
committer | Pablo Neira Ayuso <pablo@netfilter.org> | 2018-08-30 12:19:36 +0200 |
commit | dfd72398d44ebbe17929d6e8ca0c870087a0c644 (patch) | |
tree | a4dbab2e4c814f99f7ffe2d4831a82ceb249c249 /src/parser_json.c | |
parent | 8125785d5c5d35ec275e508166091d5472748bc1 (diff) |
JSON: Review payload expression
For raw payloads, property "name" is not needed, it's clearly identified
by base/offset/len properties.
In non-raw payload expressions, rename property "name" to "protocol" as
suggested during NFWS.
Signed-off-by: Phil Sutter <phil@nwl.cc>
Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
Diffstat (limited to 'src/parser_json.c')
-rw-r--r-- | src/parser_json.c | 58 |
1 files changed, 24 insertions, 34 deletions
diff --git a/src/parser_json.c b/src/parser_json.c index dd21d428..7dd621d8 100644 --- a/src/parser_json.c +++ b/src/parser_json.c @@ -467,56 +467,46 @@ static const struct proto_desc *proto_lookup_byname(const char *name) static struct expr *json_parse_payload_expr(struct json_ctx *ctx, const char *type, json_t *root) { - const char *name; - const char *field; - int val; - const struct proto_desc *proto; - - if (json_unpack_err(ctx, root, "{s:s}", "name", &name)) - return NULL; - - /* special treatment for raw */ + const char *protocol, *field, *base; + int offset, len, val; - if (!strcmp(name, "raw")) { - int offset, len, baseval; + if (!json_unpack(root, "{s:s, s:i, s:i}", + "base", &base, "offset", &offset, "len", &len)) { struct expr *expr; - const char *base; - if (json_unpack_err(ctx, root, "{s:s, s:i, s:i}", - "base", &base, - "offset", &offset, - "len", &len)) - return NULL; if (!strcmp(base, "ll")) { - baseval = PROTO_BASE_LL_HDR; + val = PROTO_BASE_LL_HDR; } else if (!strcmp(base, "nh")) { - baseval = PROTO_BASE_NETWORK_HDR; + val = PROTO_BASE_NETWORK_HDR; } else if (!strcmp(base, "th")) { - baseval = PROTO_BASE_TRANSPORT_HDR; + val = PROTO_BASE_TRANSPORT_HDR; } else { json_error(ctx, "Invalid payload base '%s'.", base); return NULL; } expr = payload_expr_alloc(int_loc, NULL, 0); - payload_init_raw(expr, baseval, offset, len); + payload_init_raw(expr, val, offset, len); expr->byteorder = BYTEORDER_BIG_ENDIAN; expr->payload.is_raw = true; - return expr; - } + } else if (!json_unpack(root, "{s:s, s:s}", + "protocol", &protocol, "field", &field)) { + const struct proto_desc *proto = proto_lookup_byname(protocol); - proto = proto_lookup_byname(name); - if (!proto) { - json_error(ctx, "Unknown payload expr name '%s'.", name); - return NULL; - } - if (json_unpack_err(ctx, root, "{s:s}", "field", &field)) - return NULL; - if (json_parse_payload_field(proto, field, &val)) { - json_error(ctx, "Unknown %s field '%s'.", name, field); - return NULL; + if (!proto) { + json_error(ctx, "Unknown payload protocol '%s'.", + protocol); + return NULL; + } + if (json_parse_payload_field(proto, field, &val)) { + json_error(ctx, "Unknown %s field '%s'.", + protocol, field); + return NULL; + } + return payload_expr_alloc(int_loc, proto, val); } - return payload_expr_alloc(int_loc, proto, val); + json_error(ctx, "Invalid payload expression properties."); + return NULL; } static struct expr *json_parse_tcp_option_expr(struct json_ctx *ctx, |