]> git.ipfire.org Git - thirdparty/knot-resolver.git/commitdiff
daemon/worker: implemented iteration limit
authorMarek Vavruša <marek.vavrusa@nic.cz>
Tue, 28 Apr 2015 06:59:04 +0000 (08:59 +0200)
committerMarek Vavruša <marek.vavrusa@nic.cz>
Tue, 28 Apr 2015 06:59:04 +0000 (08:59 +0200)
refs #15

daemon/engine.h
daemon/io.c
daemon/io.h
daemon/worker.c
lib/defines.h
lib/resolve.c

index d7acd94d8a8d8db8c8ccd6e3eaa2b4ff7840585a..bb1f9c37cdc0a1df9acccac4504f0da6cc880015 100644 (file)
@@ -39,6 +39,6 @@ int engine_start(struct engine *engine);
 void engine_stop(struct engine *engine);
 int engine_register(struct engine *engine, const char *module);
 int engine_unregister(struct engine *engine, const char *module);
-/** Return engine light userdata. */
 void engine_lualib(struct engine *engine, const char *name, int (*lib_cb) (struct lua_State *));
+/** Return engine light userdata. */
 struct engine *engine_luaget(struct lua_State *L);
index 6f7e01187b50f75f3e5b33128e210aae55250350..548100371c3e5cc541833ab68f95abd2f1f6e3e9 100644 (file)
@@ -56,7 +56,7 @@ void udp_recv(uv_udp_t *handle, ssize_t nread, const uv_buf_t *buf,
 
        /* UDP requests are oneshot, always close afterwards */
        if (handle->data && !uv_is_closing((uv_handle_t *)handle)) { /* Do not free master socket */
-               uv_close((uv_handle_t *)handle, handle_free);
+               io_close((uv_handle_t *)handle);
        }
 
        /* Check the incoming wire length. */
@@ -96,7 +96,7 @@ static void tcp_recv(uv_stream_t *handle, ssize_t nread, const uv_buf_t *buf)
 
        /* Check for connection close */
        if (nread <= 0) {
-               uv_close((uv_handle_t *)handle, handle_free);
+               io_close((uv_handle_t *)handle);
                return;
        } else if (nread < 2) {
                /* Not enough bytes to read length */
@@ -175,6 +175,11 @@ uv_handle_t *io_create(uv_loop_t *loop, int type)
        }
 }
 
+void io_close(uv_handle_t *handle)
+{
+       uv_close(handle, (uv_close_cb) handle_free);
+}
+
 int io_start_read(uv_handle_t *handle)
 {
        if (handle->type == UV_UDP) {
@@ -191,4 +196,4 @@ int io_stop_read(uv_handle_t *handle)
        } else {
                return uv_read_stop((uv_stream_t *)handle);
        }
-}
\ No newline at end of file
+}
index 815387f0a7c348c19243a12a3920877f0e14fbe0..83e01a0683228e235b87f98263dfe6eeecbc43dc 100644 (file)
@@ -25,5 +25,6 @@ void udp_unbind(struct endpoint *ep);
 int tcp_bind(struct endpoint *ep, struct sockaddr *addr);
 void tcp_unbind(struct endpoint *ep);
 uv_handle_t *io_create(uv_loop_t *loop, int type);
+void io_close(uv_handle_t *handle);
 int io_start_read(uv_handle_t *handle);
 int io_stop_read(uv_handle_t *handle);
\ No newline at end of file
index 732b309774861e779b39cfb5ce7977ebb22495e3..55fbbd9a475b17f619c1c3967957f0b9aacc7f3f 100644 (file)
@@ -15,7 +15,6 @@
  */
 
 #include <uv.h>
-
 #include <libknot/packet/pkt.h>
 #include <libknot/internal/net.h>
 #include <libknot/internal/mempool.h>
@@ -43,8 +42,11 @@ struct qr_task
                } addr;
                uv_handle_t *handle;
        } source;
+       uint16_t iter_count;
+       uint16_t flags;
 };
 
+/* Forward decls */
 static int qr_task_step(struct qr_task *task, knot_pkt_t *packet);
 
 static int parse_query(knot_pkt_t *query)
@@ -71,6 +73,7 @@ static struct qr_task *qr_task_create(struct worker_ctx *worker, uv_handle_t *ha
        /* Create worker task */
        struct engine *engine = worker->engine;
        struct qr_task *task = mm_alloc(&pool, sizeof(*task));
+       memset(task, 0, sizeof(*task));
        if (!task) {
                mp_delete(pool.ctx);
                return NULL;
@@ -98,7 +101,7 @@ static struct qr_task *qr_task_create(struct worker_ctx *worker, uv_handle_t *ha
        return task;
 }
 
-static void qr_task_close(uv_handle_t *handle)
+static void qr_task_free(uv_handle_t *handle)
 {
        struct qr_task *task = handle->data;
        mp_delete(task->req.pool.ctx);
@@ -123,9 +126,8 @@ static void qr_task_on_send(uv_req_t* req, int status)
                        if (status == 0 && task->next_handle) {
                                io_start_read(task->next_handle);
                        }
-               } else {
-                       /* Finalize task */
-                       uv_close((uv_handle_t *)&task->timeout, qr_task_close);
+               } else { /* Finalize task */
+                       uv_close((uv_handle_t *)&task->timeout, qr_task_free);
                }
        }
 }
@@ -163,7 +165,6 @@ static void qr_task_on_connect(uv_connect_t *connect, int status)
 static int qr_task_finalize(struct qr_task *task, int state)
 {
        kr_resolve_finish(&task->req, state);
-       uv_timer_stop(&task->timeout);
        qr_task_send(task, task->source.handle, (struct sockaddr *)&task->source.addr, task->req.answer);
        return state == KNOT_STATE_DONE ? 0 : kr_error(EIO);
 }
@@ -188,6 +189,11 @@ static int qr_task_step(struct qr_task *task, knot_pkt_t *packet)
                return qr_task_finalize(task, state);
        }
 
+       /* Iteration limit */
+       if (++task->iter_count > KR_ITER_LIMIT) {
+               return qr_task_finalize(task, KNOT_STATE_FAIL);
+       }
+
        /* Create connection for iterative query */
        uv_handle_t *source_handle = task->source.handle;
        task->next_handle = io_create(source_handle->loop, sock_type);
@@ -233,7 +239,6 @@ int worker_exec(struct worker_ctx *worker, uv_handle_t *handle, knot_pkt_t *quer
        struct qr_task *task = handle->data;
        bool is_master_socket = (!task);
        if (is_master_socket) {
-               /* Accept only queries */
                if (knot_wire_get_qr(query->wire)) {
                        return kr_error(EINVAL); /* Ignore. */
                }
index 141f219557df72af09e1b7b5f38297ec84595925..773314a11b1de3cd81f89d36c2641f9ba8342022 100644 (file)
@@ -33,7 +33,7 @@
  * @cond internal
  */
 #define KR_CONN_RTT_MAX 5000 /* Timeout for network activity */
-#define ITER_LIMIT 50        /* Built-in iterator limit */
+#define KR_ITER_LIMIT 50        /* Built-in iterator limit */
 
 /*
  * Timers.
index 4c1b912008452f5a483b796b86943578f7159631..1a96d03d06fc49410ee71b7de5f2dab8c883c5eb 100644 (file)
@@ -168,7 +168,7 @@ int kr_resolve(struct kr_context* ctx, knot_pkt_t *answer,
        int state = kr_resolve_query(&request, qname, qclass, qtype);
        while (state == KNOT_STATE_PRODUCE) {
                /* Hardlimit on iterative queries */
-               if (++iter_count > ITER_LIMIT) {
+               if (++iter_count > KR_ITER_LIMIT) {
                        DEBUG_MSG("iteration limit %d reached\n", ITER_LIMIT);
                        state = KNOT_STATE_FAIL;
                        break;