Skip to content
Snippets Groups Projects
Commit c8f919ec authored by Marek Vavruša's avatar Marek Vavruša
Browse files

resolve: set limit to prevent infinite loops on server failure

parent 9570dd89
Branches
Tags
No related merge requests found
......@@ -52,7 +52,7 @@ static int input_query(knot_layer_t *ctx, knot_pkt_t *pkt)
knot_pkt_t *answer = param->result->ans;
knot_wire_set_id(answer->wire, knot_wire_get_id(pkt->wire));
if (ret != 0) {
if (ret != KNOT_EOK) {
return KNOT_NS_PROC_FAIL;
} else {
return KNOT_NS_PROC_DONE;
......
......@@ -12,6 +12,8 @@
#define DEBUG_MSG(fmt, ...) fprintf(stderr, "[reslv] " fmt, ## __VA_ARGS__)
static int resolve_ns(struct kr_context *resolve, struct kr_ns *ns)
/* Defines */
#define ITER_LIMIT 50
{
/* Create an address query. */
struct kr_query *qry = kr_rplan_push(&resolve->rplan, ns->name,
......@@ -114,12 +116,23 @@ int kr_resolve(struct kr_context* ctx, struct kr_result* result,
knot_requestor_overlay(&requestor, LAYER_STATIC, &param);
knot_requestor_overlay(&requestor, LAYER_ITERATE, &param);
knot_requestor_overlay(&requestor, LAYER_STATS, &param);
unsigned iter_count = 0;
while(ctx->state & (KNOT_NS_PROC_MORE|KNOT_NS_PROC_FULL)) {
iterate(&requestor, ctx);
if (++iter_count > ITER_LIMIT) {
DEBUG_MSG("iteration limit %d reached => SERVFAIL\n", ITER_LIMIT);
ctx->state = KNOT_NS_PROC_FAIL;
}
}
/* Clean up. */
knot_requestor_clear(&requestor);
return 0;
/* Set RCODE on internal failure. */
if (ctx->state != KNOT_NS_PROC_DONE) {
knot_wire_set_rcode(result->ans->wire, KNOT_RCODE_SERVFAIL);
return KNOT_ERROR;
}
return KNOT_EOK;
}
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment