summaryrefslogtreecommitdiffstats
path: root/src/parser_json.c
diff options
context:
space:
mode:
authorPhil Sutter <phil@nwl.cc>2018-08-29 16:23:24 +0200
committerPablo Neira Ayuso <pablo@netfilter.org>2018-08-30 12:19:36 +0200
commitdfd72398d44ebbe17929d6e8ca0c870087a0c644 (patch)
treea4dbab2e4c814f99f7ffe2d4831a82ceb249c249 /src/parser_json.c
parent8125785d5c5d35ec275e508166091d5472748bc1 (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.c58
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,