diff options
author | Alvaro Neira <alvaroneay@gmail.com> | 2014-09-30 17:21:38 +0200 |
---|---|---|
committer | Pablo Neira Ayuso <pablo@netfilter.org> | 2014-10-09 13:22:55 +0200 |
commit | ffac724a876d1fb3ae08b7da727d251a6762358c (patch) | |
tree | e3d51d13203c0cd48427fbc1fac4765f5264f3ba | |
parent | 389545e6fda863f8804b513b8dca4c4db4a7c5a6 (diff) |
src: Enhance payload_gen_dependency()
With this patch, this function returns a statement with the new dependency
that we want to add, instead of an expression.
This change is needed in a follow up patch.
Signed-off-by: Alvaro Neira Ayuso <alvaroneay@gmail.com>
Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
-rw-r--r-- | include/payload.h | 3 | ||||
-rw-r--r-- | include/statement.h | 1 | ||||
-rw-r--r-- | src/evaluate.c | 9 | ||||
-rw-r--r-- | src/payload.c | 18 |
4 files changed, 20 insertions, 11 deletions
diff --git a/include/payload.h b/include/payload.h index d47e5645..95364af1 100644 --- a/include/payload.h +++ b/include/payload.h @@ -11,8 +11,9 @@ extern void payload_init_raw(struct expr *expr, enum proto_bases base, unsigned int offset, unsigned int len); struct eval_ctx; +struct stmt; extern int payload_gen_dependency(struct eval_ctx *ctx, const struct expr *expr, - struct expr **res); + struct stmt **res); extern bool payload_is_adjacent(const struct expr *e1, const struct expr *e2); extern struct expr *payload_expr_join(const struct expr *e1, diff --git a/include/statement.h b/include/statement.h index e2f02b8c..7a57f7dd 100644 --- a/include/statement.h +++ b/include/statement.h @@ -166,6 +166,7 @@ struct stmt { extern struct stmt *stmt_alloc(const struct location *loc, const struct stmt_ops *ops); +int stmt_evaluate(struct eval_ctx *ctx, struct stmt *stmt); extern void stmt_free(struct stmt *stmt); extern void stmt_list_free(struct list_head *list); extern void stmt_print(const struct stmt *stmt); diff --git a/src/evaluate.c b/src/evaluate.c index 284ee72a..52ce5487 100644 --- a/src/evaluate.c +++ b/src/evaluate.c @@ -26,7 +26,6 @@ #include <utils.h> static int expr_evaluate(struct eval_ctx *ctx, struct expr **expr); -static int stmt_evaluate(struct eval_ctx *ctx, struct stmt *stmt); static const char *byteorder_names[] = { [BYTEORDER_INVALID] = "invalid", @@ -271,13 +270,9 @@ static int expr_evaluate_payload(struct eval_ctx *ctx, struct expr **expr) struct expr *payload = *expr; enum proto_bases base = payload->payload.base; struct stmt *nstmt; - struct expr *nexpr; if (ctx->pctx.protocol[base].desc == NULL) { - if (payload_gen_dependency(ctx, payload, &nexpr) < 0) - return -1; - nstmt = expr_stmt_alloc(&nexpr->location, nexpr); - if (stmt_evaluate(ctx, nstmt) < 0) + if (payload_gen_dependency(ctx, payload, &nstmt) < 0) return -1; list_add_tail(&nstmt->list, &ctx->stmt->list); } else if (ctx->pctx.protocol[base].desc != payload->payload.desc) @@ -1205,7 +1200,7 @@ static int stmt_evaluate_log(struct eval_ctx *ctx, struct stmt *stmt) return 0; } -static int stmt_evaluate(struct eval_ctx *ctx, struct stmt *stmt) +int stmt_evaluate(struct eval_ctx *ctx, struct stmt *stmt) { #ifdef DEBUG if (debug_level & DEBUG_EVALUATION) { diff --git a/src/payload.c b/src/payload.c index a3bbe51e..b7b74edd 100644 --- a/src/payload.c +++ b/src/payload.c @@ -21,6 +21,7 @@ #include <rule.h> #include <expression.h> +#include <statement.h> #include <payload.h> #include <gmputil.h> #include <utils.h> @@ -160,12 +161,13 @@ void payload_init_raw(struct expr *expr, enum proto_bases base, * in the input path though. */ int payload_gen_dependency(struct eval_ctx *ctx, const struct expr *expr, - struct expr **res) + struct stmt **res) { const struct hook_proto_desc *h = &hook_proto_desc[ctx->pctx.family]; const struct proto_desc *desc; const struct proto_hdr_template *tmpl; struct expr *dep, *left, *right; + struct stmt *stmt; int protocol; uint16_t type; @@ -186,7 +188,12 @@ int payload_gen_dependency(struct eval_ctx *ctx, const struct expr *expr, 2 * BITS_PER_BYTE, &type); dep = relational_expr_alloc(&expr->location, OP_EQ, left, right); - *res = dep; + stmt = expr_stmt_alloc(&dep->location, dep); + if (stmt_evaluate(ctx, stmt) < 0) { + return expr_error(ctx->msgs, expr, + "dependency statement is invalid"); + } + *res = stmt; return 0; } @@ -220,8 +227,13 @@ int payload_gen_dependency(struct eval_ctx *ctx, const struct expr *expr, constant_data_ptr(protocol, tmpl->len)); dep = relational_expr_alloc(&expr->location, OP_EQ, left, right); + stmt = expr_stmt_alloc(&dep->location, dep); + if (stmt_evaluate(ctx, stmt) < 0) { + return expr_error(ctx->msgs, expr, + "dependency statement is invalid"); + } left->ops->pctx_update(&ctx->pctx, dep); - *res = dep; + *res = stmt; return 0; } |