From 971b4c5937a3b15e9c5ddf55e3c9fb78b1790bbc Mon Sep 17 00:00:00 2001 From: Lubos Slovak <lubos.slovak@nic.cz> Date: Wed, 28 May 2014 11:23:54 +0200 Subject: [PATCH] axfr: Reviewed axfr.c/.h and fixed small issues. - Unified function names. - Added missing parameter checks where necessary. - Fixed line length. --- src/knot/nameserver/axfr.c | 62 +++++++++++++++++++---------- src/knot/nameserver/axfr.h | 2 +- src/knot/nameserver/ixfr.c | 2 +- src/knot/nameserver/process_query.c | 2 +- 4 files changed, 45 insertions(+), 23 deletions(-) diff --git a/src/knot/nameserver/axfr.c b/src/knot/nameserver/axfr.c index 28b0d3d486..9beda87040 100644 --- a/src/knot/nameserver/axfr.c +++ b/src/knot/nameserver/axfr.c @@ -31,8 +31,11 @@ struct axfr_proc { unsigned cur_rrset; }; -static int put_rrsets(knot_pkt_t *pkt, zone_node_t *node, struct axfr_proc *state) +static int axfr_put_rrsets(knot_pkt_t *pkt, zone_node_t *node, + struct axfr_proc *state) { + assert(node != NULL); + int ret = KNOT_EOK; int i = state->cur_rrset; uint16_t rrset_count = node->rrset_count; @@ -57,8 +60,11 @@ static int put_rrsets(knot_pkt_t *pkt, zone_node_t *node, struct axfr_proc *stat return ret; } -static int axfr_process_node_tree(knot_pkt_t *pkt, const void *item, struct xfr_proc *state) +static int axfr_process_node_tree(knot_pkt_t *pkt, const void *item, + struct xfr_proc *state) { + assert(item != NULL); + struct axfr_proc *axfr = (struct axfr_proc*)state; if (axfr->i == NULL) { @@ -68,9 +74,9 @@ static int axfr_process_node_tree(knot_pkt_t *pkt, const void *item, struct xfr_ /* Put responses. */ int ret = KNOT_EOK; zone_node_t *node = NULL; - while(!hattrie_iter_finished(axfr->i)) { + while (!hattrie_iter_finished(axfr->i)) { node = (zone_node_t *)*hattrie_iter_val(axfr->i); - ret = put_rrsets(pkt, node, axfr); + ret = axfr_put_rrsets(pkt, node, axfr); if (ret != KNOT_EOK) { break; } @@ -124,14 +130,19 @@ static int axfr_query_init(struct query_data *qdata) qdata->ext = axfr; qdata->ext_cleanup = &axfr_query_cleanup; - /* No zone changes during multipacket answer (unlocked in axfr_answer_cleanup) */ + /* No zone changes during multipacket answer + (unlocked in axfr_answer_cleanup) */ rcu_read_lock(); return KNOT_EOK; } -int xfr_process_list(knot_pkt_t *pkt, xfr_put_cb process_item, struct query_data *qdata) +int xfr_process_list(knot_pkt_t *pkt, xfr_put_cb process_item, + struct query_data *qdata) { + if (pkt == NULL || qdata == NULL || qdata->ext == NULL) { + return KNOT_EINVAL; + } int ret = KNOT_EOK; mm_ctx_t *mm = qdata->mm; @@ -177,10 +188,11 @@ int xfr_process_list(knot_pkt_t *pkt, xfr_put_cb process_item, struct query_data #define AXFROUT_LOG(severity, msg...) \ QUERY_LOG(severity, qdata, "Outgoing AXFR", msg) -int axfr_query(knot_pkt_t *pkt, struct query_data *qdata) +int axfr_process_query(knot_pkt_t *pkt, struct query_data *qdata) { - assert(pkt); - assert(qdata); + if (pkt == NULL || qdata == NULL) { + return KNOT_EINVAL; + } int ret = KNOT_EOK; struct timeval now = {0}; @@ -197,14 +209,17 @@ int axfr_query(knot_pkt_t *pkt, struct query_data *qdata) /* Check valid zone, transaction security and contents. */ NS_NEED_ZONE(qdata, KNOT_RCODE_NOTAUTH); NS_NEED_AUTH(&qdata->zone->conf->acl.xfr_out, qdata); - NS_NEED_ZONE_CONTENTS(qdata, KNOT_RCODE_SERVFAIL); /* Check expiration. */ + /* Check expiration. */ + NS_NEED_ZONE_CONTENTS(qdata, KNOT_RCODE_SERVFAIL); ret = axfr_query_init(qdata); if (ret != KNOT_EOK) { - AXFROUT_LOG(LOG_ERR, "Failed to start (%s).", knot_strerror(ret)); + AXFROUT_LOG(LOG_ERR, "Failed to start (%s).", + knot_strerror(ret)); return ret; } else { - AXFROUT_LOG(LOG_INFO, "Started (serial %u).", zone_contents_serial(qdata->zone->contents)); + AXFROUT_LOG(LOG_INFO, "Started (serial %u).", + zone_contents_serial(qdata->zone->contents)); } } @@ -219,9 +234,9 @@ int axfr_query(knot_pkt_t *pkt, struct query_data *qdata) return NS_PROC_FULL; /* Check for more. */ case KNOT_EOK: /* Last response. */ gettimeofday(&now, NULL); - AXFROUT_LOG(LOG_INFO, "Finished in %.02fs (%u messages, ~%.01fkB).", - time_diff(&axfr->proc.tstamp, &now) / 1000.0, - axfr->proc.npkts, axfr->proc.nbytes / 1024.0); + AXFROUT_LOG(LOG_INFO, "Finished in %.02fs (%u messages, ~%.01f" + "kB).", time_diff(&axfr->proc.tstamp, &now) / 1000.0, + axfr->proc.npkts, axfr->proc.nbytes / 1024.0); return NS_PROC_DONE; break; default: /* Generic error. */ @@ -233,6 +248,8 @@ int axfr_query(knot_pkt_t *pkt, struct query_data *qdata) static void axfr_answer_cleanup(struct answer_data *data) { + assert(data != NULL); + struct xfr_proc *proc = data->ext; if (proc) { zone_contents_deep_free(&proc->contents); @@ -291,13 +308,15 @@ static int axfr_answer_finalize(struct answer_data *data) /* Write zone file. */ zone_t *zone = data->param->zone; - rc = zonefile_write(zone->conf->file, proc->contents, data->param->remote); + rc = zonefile_write(zone->conf->file, proc->contents, + data->param->remote); if (rc != KNOT_EOK) { return rc; } /* Switch contents. */ - zone_contents_t *old_contents = zone_switch_contents(zone, proc->contents); + zone_contents_t *old_contents = + zone_switch_contents(zone, proc->contents); synchronize_rcu(); AXFRIN_LOG(LOG_INFO, "Serial %u -> %u", zone_contents_serial(old_contents), @@ -316,9 +335,8 @@ static int axfr_answer_finalize(struct answer_data *data) static int process_axfr_packet(knot_pkt_t *pkt, struct xfr_proc *proc) { - if (pkt == NULL) { - return NS_PROC_FAIL; - } + assert(pkt != NULL); + assert(proc != NULL); ++proc->npkts; @@ -344,6 +362,10 @@ static int process_axfr_packet(knot_pkt_t *pkt, struct xfr_proc *proc) int axfr_process_answer(knot_pkt_t *pkt, struct answer_data *data) { + if (pkt == NULL || data == NULL) { + return NS_PROC_FAIL; + } + /* Initialize processing with first packet. */ if (data->ext == NULL) { NS_NEED_TSIG_SIGNED(&data->param->tsig_ctx, 0); diff --git a/src/knot/nameserver/axfr.h b/src/knot/nameserver/axfr.h index 1be08c583b..d58c7071a9 100644 --- a/src/knot/nameserver/axfr.h +++ b/src/knot/nameserver/axfr.h @@ -58,7 +58,7 @@ int xfr_process_list(knot_pkt_t *pkt, xfr_put_cb put, struct query_data *qdata); * \retval FAIL if it encountered an error. * \retval DONE if finished. */ -int axfr_query(knot_pkt_t *pkt, struct query_data *qdata); +int axfr_process_query(knot_pkt_t *pkt, struct query_data *qdata); /*! * \brief Processes an AXFR query response. diff --git a/src/knot/nameserver/ixfr.c b/src/knot/nameserver/ixfr.c index eac0fa42f8..4e31b32f16 100644 --- a/src/knot/nameserver/ixfr.c +++ b/src/knot/nameserver/ixfr.c @@ -591,7 +591,7 @@ int ixfr_query(knot_pkt_t *pkt, struct query_data *qdata) case KNOT_ENOENT: IXFROUT_LOG(LOG_INFO, "Incomplete history, fallback to AXFR."); qdata->packet_type = KNOT_QUERY_AXFR; /* Solve as AXFR. */ - return axfr_query(pkt, qdata); + return axfr_process_query(pkt, qdata); default: /* Server errors. */ IXFROUT_LOG(LOG_ERR, "Failed to start (%s).", knot_strerror(ret)); return NS_PROC_FAIL; diff --git a/src/knot/nameserver/process_query.c b/src/knot/nameserver/process_query.c index df7afbda36..80fd2cc2e2 100644 --- a/src/knot/nameserver/process_query.c +++ b/src/knot/nameserver/process_query.c @@ -390,7 +390,7 @@ static int query_internet(knot_pkt_t *pkt, knot_process_t *ctx) next_state = notify_query(pkt, data); break; case KNOT_QUERY_AXFR: - next_state = axfr_query(pkt, data); + next_state = axfr_process_query(pkt, data); break; case KNOT_QUERY_IXFR: next_state = ixfr_query(pkt, data); -- GitLab