diff --git a/dap_dns_server.c b/dap_dns_server.c index 60e657e652860184a07e9bbe0aa5b6995b9d0df3..a93c8f55cd8720f6f481afdc8619ba898a35f4f8 100755 --- a/dap_dns_server.c +++ b/dap_dns_server.c @@ -155,7 +155,7 @@ dap_dns_zone_callback_t dap_dns_zone_find(char *hostname) { return dap_dns_zone_find(zone_up); } else { return asked_zone->callback; - } + } return NULL; } @@ -214,38 +214,38 @@ void dap_dns_client_read(dap_client_remote_t *client, void * arg) { if (val) { // No other sections should present goto cleanup; } - dap_dns_buf_put_uint16(dns_reply, val); + dap_dns_buf_put_uint16(dns_reply, val); int dot_count = 0; dap_string_t *dns_hostname = dap_string_new(""); for (int i = 0; i < qdcount; i++) { block_len = strlen(&dns_message->data[dns_message->ptr]) + 1 + 2 * sizeof(uint16_t); dns_reply->data = DAP_REALLOC(dns_reply->data, dns_reply->ptr + block_len); memcpy(&dns_reply->data[dns_reply->ptr], &dns_message->data[dns_message->ptr], block_len); - dns_reply->ptr += block_len; - if (flags->rcode) + dns_reply->ptr += block_len; + if (flags->rcode) break; while (dns_message->ptr < dns_reply->ptr - 2 * sizeof(uint16_t)) { - uint8_t len = dns_message->data[dns_message->ptr++]; - if (len > DNS_MAX_DOMAIN_NAME_LEN) { - flags->rcode = DNS_ERROR_NAME; - break; - } - if (!len) { - break; - } - if (dot_count) { - if (dot_count > 3) { // Max three dots allowed - flags->rcode = DNS_ERROR_NAME; - break; - } - dap_string_append(dns_hostname, "."); + uint8_t len = dns_message->data[dns_message->ptr++]; + if (len > DNS_MAX_DOMAIN_NAME_LEN) { + flags->rcode = DNS_ERROR_NAME; + break; + } + if (!len) { + break; + } + if (dot_count) { + if (dot_count > 3) { // Max three dots allowed + flags->rcode = DNS_ERROR_NAME; + break; + } + dap_string_append(dns_hostname, "."); } dap_string_append_len(dns_hostname, &dns_message->data[dns_message->ptr], len); - dns_message->ptr += len; - dot_count++; - if (dns_hostname->len >= DNS_MAX_HOSTNAME_LEN) { - flags->rcode = DNS_ERROR_NAME; - break; + dns_message->ptr += len; + dot_count++; + if (dns_hostname->len >= DNS_MAX_HOSTNAME_LEN) { + flags->rcode = DNS_ERROR_NAME; + break; } } val = dap_dns_buf_get_uint16(dns_message); // DNS record type @@ -261,16 +261,16 @@ void dap_dns_client_read(dap_client_remote_t *client, void * arg) { if (dns_message->ptr != dns_reply->ptr) { log_it(L_ERROR, "DNS parser pointer unequal, mptr = %u, rptr = %u", dns_message->ptr, dns_reply->ptr); } - } - // Find ip addr + } + // Find ip addr uint32_t ip_addr = 0; if (flags->rcode == DNS_ERROR_NONE) { - dap_dns_zone_callback_t callback = dap_dns_zone_find(dns_hostname->str); + dap_dns_zone_callback_t callback = dap_dns_zone_find(dns_hostname->str); if (callback) { - ip_addr = callback(dns_hostname->str); + ip_addr = callback(dns_hostname->str); } - } - if (ip_addr) { + } + if (ip_addr) { // Compose DNS answer block_len = DNS_ANSWER_SIZE; dns_reply->data = DAP_REALLOC(dns_reply->data, dns_reply->ptr + block_len); @@ -284,13 +284,13 @@ void dap_dns_client_read(dap_client_remote_t *client, void * arg) { dap_dns_buf_put_uint32(dns_reply, ttl); val = 4; // RD len for ipv4 dap_dns_buf_put_uint16(dns_reply, val); - dap_dns_buf_put_uint32(dns_reply, ip_addr); - } else if (flags->rcode == DNS_ERROR_NONE) { - flags->rcode = DNS_ERROR_NAME; - } - if (flags->rcode) { - dns_reply->data[7] = 0; // No answer section - } + dap_dns_buf_put_uint32(dns_reply, ip_addr); + } else if (flags->rcode == DNS_ERROR_NONE) { + flags->rcode = DNS_ERROR_NAME; + } + if (flags->rcode) { + dns_reply->data[7] = 0; // No answer section + } // Set reply flags dns_reply->data[2] = msg_flags.val >> 8; dns_reply->data[3] = msg_flags.val; @@ -310,6 +310,11 @@ void dap_dns_server_start() { s_dns_server = DAP_NEW(dap_dns_server_t); s_dns_server->hash_table = NULL; s_dns_server->instance = dap_udp_server_listen(DNS_LISTEN_PORT); + if (!s_dns_server->instance) { + log_it(L_ERROR, "Can't star DNS server"); + return; + } + s_dns_server->instance->client_read_callback = dap_dns_client_read; s_dns_server->instance->client_read_callback = *dap_dns_client_read; s_dns_server->instance->client_write_callback = NULL; s_dns_server->instance->client_new_callback = NULL; @@ -326,6 +331,6 @@ void dap_dns_server_stop() { DAP_DELETE(current_zone); } // TODO add code to stop udp_thread - dap_udp_server_delete(s_dns_server->instance); + dap_udp_server_delete(s_dns_server->instance); DAP_DELETE(s_dns_server); }