From: Daniel Salzman Date: Mon, 5 Aug 2019 19:00:17 +0000 (+0200) Subject: knotc: print an error if zone-(read,get,diff) got invalid rrtype X-Git-Tag: v2.9.0~164 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=f317f7945fbef78f8ad649ff25d5da7e007a8b95;p=thirdparty%2Fknot-dns.git knotc: print an error if zone-(read,get,diff) got invalid rrtype fixes #652 --- diff --git a/src/knot/ctl/commands.c b/src/knot/ctl/commands.c index 923a785134..a21266e4cf 100644 --- a/src/knot/ctl/commands.c +++ b/src/knot/ctl/commands.c @@ -534,11 +534,12 @@ typedef struct { char rdata[2 * 65536]; } send_ctx_t; -static send_ctx_t *create_send_ctx(const knot_dname_t *zone_name, ctl_args_t *args) +static int create_send_ctx(send_ctx_t **out, const knot_dname_t *zone_name, + ctl_args_t *args) { send_ctx_t *ctx = mm_calloc(&args->mm, 1, sizeof(*ctx)); if (ctx == NULL) { - return NULL; + return KNOT_ENOMEM; } ctx->args = args; @@ -558,7 +559,7 @@ static send_ctx_t *create_send_ctx(const knot_dname_t *zone_name, ctl_args_t *ar // Set the ZONE. if (knot_dname_to_str(ctx->zone, zone_name, sizeof(ctx->zone)) == NULL) { mm_free(&args->mm, ctx); - return NULL; + return KNOT_EINVAL; } // Set the TYPE filter. @@ -566,14 +567,16 @@ static send_ctx_t *create_send_ctx(const knot_dname_t *zone_name, ctl_args_t *ar uint16_t type; if (knot_rrtype_from_string(args->data[KNOT_CTL_IDX_TYPE], &type) != 0) { mm_free(&args->mm, ctx); - return NULL; + return KNOT_EINVAL; } ctx->type_filter = type; } else { ctx->type_filter = -1; } - return ctx; + *out = ctx; + + return KNOT_EOK; } static int send_rrset(knot_rrset_t *rrset, send_ctx_t *ctx) @@ -682,13 +685,12 @@ static int get_owner(uint8_t *out, size_t out_len, knot_dname_t *origin, static int zone_read(zone_t *zone, ctl_args_t *args) { - send_ctx_t *ctx = create_send_ctx(zone->name, args); - if (ctx == NULL) { - return KNOT_ENOMEM; + send_ctx_t *ctx; + int ret = create_send_ctx(&ctx, zone->name, args); + if (ret != KNOT_EOK) { + return ret; } - int ret = KNOT_EOK; - if (args->data[KNOT_CTL_IDX_OWNER] != NULL) { uint8_t owner[KNOT_DNAME_MAXLEN]; @@ -720,14 +722,13 @@ static int zone_flag_txn_get(zone_t *zone, ctl_args_t *args, const char *flag) return KNOT_TXN_ENOTEXISTS; } - send_ctx_t *ctx = create_send_ctx(zone->name, args); - if (ctx == NULL) { - return KNOT_ENOMEM; + send_ctx_t *ctx; + int ret = create_send_ctx(&ctx, zone->name, args); + if (ret != KNOT_EOK) { + return ret; } ctx->data[KNOT_CTL_IDX_FLAGS] = flag; - int ret = KNOT_EOK; - if (args->data[KNOT_CTL_IDX_OWNER] != NULL) { uint8_t owner[KNOT_DNAME_MAXLEN]; @@ -856,12 +857,13 @@ static int zone_txn_diff(zone_t *zone, ctl_args_t *args) return zone_flag_txn_get(zone, args, CTL_FLAG_ADD); } - send_ctx_t *ctx = create_send_ctx(zone->name, args); - if (ctx == NULL) { - return KNOT_ENOMEM; + send_ctx_t *ctx; + int ret = create_send_ctx(&ctx, zone->name, args); + if (ret != KNOT_EOK) { + return ret; } - int ret = send_changeset(&zone->control_update->change, ctx); + ret = send_changeset(&zone->control_update->change, ctx); mm_free(&args->mm, ctx); return ret; } diff --git a/src/utils/knotc/commands.c b/src/utils/knotc/commands.c index 9ca4575617..43ed8aba21 100644 --- a/src/utils/knotc/commands.c +++ b/src/utils/knotc/commands.c @@ -27,6 +27,7 @@ #include "knot/zone/zone-load.h" #include "contrib/macros.h" #include "contrib/string.h" +#include "contrib/strtonum.h" #include "contrib/openbsd/strlcat.h" #include "utils/knotc/commands.h" #include "utils/knotc/estimator.h" @@ -881,8 +882,10 @@ static int set_node_items(cmd_args_t *args, knot_ctl_data_t *data, char *rdata, // Set TTL only with an editing operation. if (args->argc > idx) { + uint32_t num; uint16_t type; - if (knot_rrtype_from_string(args->argv[idx], &type) != 0) { + if (knot_rrtype_from_string(args->argv[idx], &type) != 0 && + str_to_u32(args->argv[idx], &num) == KNOT_EOK) { switch (args->desc->cmd) { case CTL_ZONE_SET: case CTL_ZONE_UNSET: @@ -890,7 +893,7 @@ static int set_node_items(cmd_args_t *args, knot_ctl_data_t *data, char *rdata, idx++; break; default: - return KNOT_EINVAL; + break; } } }