From 8f56db64be3f2c57a196a5eaef0286ec71782950 Mon Sep 17 00:00:00 2001 From: Pablo Neira Ayuso Date: Tue, 7 Jul 2020 14:31:33 +0200 Subject: src: use expression to store the log prefix Intsead of using an array of char. Signed-off-by: Pablo Neira Ayuso --- src/expression.c | 9 +++++++++ src/json.c | 9 ++++++--- src/netlink_delinearize.c | 6 +++++- src/netlink_linearize.c | 7 +++++-- src/parser_bison.y | 7 ++++++- src/parser_json.c | 4 +++- src/statement.c | 11 ++++++++--- 7 files changed, 42 insertions(+), 11 deletions(-) (limited to 'src') diff --git a/src/expression.c b/src/expression.c index a6bde70f..fe529f98 100644 --- a/src/expression.c +++ b/src/expression.c @@ -175,6 +175,15 @@ void expr_describe(const struct expr *expr, struct output_ctx *octx) } } +void expr_to_string(const struct expr *expr, char *string) +{ + int len = expr->len / BITS_PER_BYTE; + + assert(expr->dtype == &string_type); + + mpz_export_data(string, expr->value, BYTEORDER_HOST_ENDIAN, len); +} + void expr_set_type(struct expr *expr, const struct datatype *dtype, enum byteorder byteorder) { diff --git a/src/json.c b/src/json.c index ed713181..24583060 100644 --- a/src/json.c +++ b/src/json.c @@ -1224,9 +1224,12 @@ json_t *log_stmt_json(const struct stmt *stmt, struct output_ctx *octx) { json_t *root = json_object(), *flags; - if (stmt->log.flags & STMT_LOG_PREFIX) - json_object_set_new(root, "prefix", - json_string(stmt->log.prefix)); + if (stmt->log.flags & STMT_LOG_PREFIX) { + char prefix[NF_LOG_PREFIXLEN] = {}; + + expr_to_string(stmt->log.prefix, prefix); + json_object_set_new(root, "prefix", json_string(prefix)); + } if (stmt->log.flags & STMT_LOG_GROUP) json_object_set_new(root, "group", json_integer(stmt->log.group)); diff --git a/src/netlink_delinearize.c b/src/netlink_delinearize.c index 8de4830c..7d7e07cf 100644 --- a/src/netlink_delinearize.c +++ b/src/netlink_delinearize.c @@ -901,7 +901,11 @@ static void netlink_parse_log(struct netlink_parse_ctx *ctx, stmt = log_stmt_alloc(loc); prefix = nftnl_expr_get_str(nle, NFTNL_EXPR_LOG_PREFIX); if (nftnl_expr_is_set(nle, NFTNL_EXPR_LOG_PREFIX)) { - stmt->log.prefix = xstrdup(prefix); + stmt->log.prefix = constant_expr_alloc(&internal_location, + &string_type, + BYTEORDER_HOST_ENDIAN, + (strlen(prefix) + 1) * BITS_PER_BYTE, + prefix); stmt->log.flags |= STMT_LOG_PREFIX; } if (nftnl_expr_is_set(nle, NFTNL_EXPR_LOG_GROUP)) { diff --git a/src/netlink_linearize.c b/src/netlink_linearize.c index 08f7f89f..528f1e5c 100644 --- a/src/netlink_linearize.c +++ b/src/netlink_linearize.c @@ -10,6 +10,7 @@ */ #include +#include #include #include @@ -1006,8 +1007,10 @@ static void netlink_gen_log_stmt(struct netlink_linearize_ctx *ctx, nle = alloc_nft_expr("log"); if (stmt->log.prefix != NULL) { - nftnl_expr_set_str(nle, NFTNL_EXPR_LOG_PREFIX, - stmt->log.prefix); + char prefix[NF_LOG_PREFIXLEN] = {}; + + expr_to_string(stmt->log.prefix, prefix); + nftnl_expr_set_str(nle, NFTNL_EXPR_LOG_PREFIX, prefix); } if (stmt->log.flags & STMT_LOG_GROUP) { nftnl_expr_set_u16(nle, NFTNL_EXPR_LOG_GROUP, stmt->log.group); diff --git a/src/parser_bison.y b/src/parser_bison.y index 72e67186..2fecc347 100644 --- a/src/parser_bison.y +++ b/src/parser_bison.y @@ -2636,7 +2636,12 @@ log_args : log_arg log_arg : PREFIX string { - $0->log.prefix = $2; + struct expr *expr; + + expr = constant_expr_alloc(&@$, &string_type, + BYTEORDER_HOST_ENDIAN, + strlen($2) * BITS_PER_BYTE, $2); + $0->log.prefix = expr; $0->log.flags |= STMT_LOG_PREFIX; } | GROUP NUM diff --git a/src/parser_json.c b/src/parser_json.c index 9fdef691..59347168 100644 --- a/src/parser_json.c +++ b/src/parser_json.c @@ -2159,7 +2159,9 @@ static struct stmt *json_parse_log_stmt(struct json_ctx *ctx, stmt = log_stmt_alloc(int_loc); if (!json_unpack(value, "{s:s}", "prefix", &tmpstr)) { - stmt->log.prefix = xstrdup(tmpstr); + stmt->log.prefix = constant_expr_alloc(int_loc, &string_type, + BYTEORDER_HOST_ENDIAN, + (strlen(tmpstr) + 1) * BITS_PER_BYTE, tmpstr); stmt->log.flags |= STMT_LOG_PREFIX; } if (!json_unpack(value, "{s:i}", "group", &tmp)) { diff --git a/src/statement.c b/src/statement.c index 21a1bc8d..afedbba2 100644 --- a/src/statement.c +++ b/src/statement.c @@ -18,6 +18,7 @@ #include #include +#include #include #include #include @@ -300,8 +301,12 @@ int log_level_parse(const char *level) static void log_stmt_print(const struct stmt *stmt, struct output_ctx *octx) { nft_print(octx, "log"); - if (stmt->log.flags & STMT_LOG_PREFIX) - nft_print(octx, " prefix \"%s\"", stmt->log.prefix); + if (stmt->log.flags & STMT_LOG_PREFIX) { + char prefix[NF_LOG_PREFIXLEN] = {}; + + expr_to_string(stmt->log.prefix, prefix); + nft_print(octx, " prefix \"%s\"", prefix); + } if (stmt->log.flags & STMT_LOG_GROUP) nft_print(octx, " group %u", stmt->log.group); if (stmt->log.flags & STMT_LOG_SNAPLEN) @@ -338,7 +343,7 @@ static void log_stmt_print(const struct stmt *stmt, struct output_ctx *octx) static void log_stmt_destroy(struct stmt *stmt) { - xfree(stmt->log.prefix); + expr_free(stmt->log.prefix); } static const struct stmt_ops log_stmt_ops = { -- cgit v1.2.3