Skip to content
Snippets Groups Projects
Commit fddad31e authored by dmitriy.gerasimov's avatar dmitriy.gerasimov
Browse files

Merge branch 'bugs-3618' into 'master'

bugs-3618

See merge request libdap-server-udp!12
parents 86b9a6f0 f3605c85
No related branches found
No related tags found
1 merge request!24Support 3689
...@@ -155,7 +155,7 @@ dap_dns_zone_callback_t dap_dns_zone_find(char *hostname) { ...@@ -155,7 +155,7 @@ dap_dns_zone_callback_t dap_dns_zone_find(char *hostname) {
return dap_dns_zone_find(zone_up); return dap_dns_zone_find(zone_up);
} else { } else {
return asked_zone->callback; return asked_zone->callback;
} }
return NULL; return NULL;
} }
...@@ -214,38 +214,38 @@ void dap_dns_client_read(dap_client_remote_t *client, void * arg) { ...@@ -214,38 +214,38 @@ void dap_dns_client_read(dap_client_remote_t *client, void * arg) {
if (val) { // No other sections should present if (val) { // No other sections should present
goto cleanup; goto cleanup;
} }
dap_dns_buf_put_uint16(dns_reply, val); dap_dns_buf_put_uint16(dns_reply, val);
int dot_count = 0; int dot_count = 0;
dap_string_t *dns_hostname = dap_string_new(""); dap_string_t *dns_hostname = dap_string_new("");
for (int i = 0; i < qdcount; i++) { for (int i = 0; i < qdcount; i++) {
block_len = strlen(&dns_message->data[dns_message->ptr]) + 1 + 2 * sizeof(uint16_t); 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); 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); memcpy(&dns_reply->data[dns_reply->ptr], &dns_message->data[dns_message->ptr], block_len);
dns_reply->ptr += block_len; dns_reply->ptr += block_len;
if (flags->rcode) if (flags->rcode)
break; break;
while (dns_message->ptr < dns_reply->ptr - 2 * sizeof(uint16_t)) { while (dns_message->ptr < dns_reply->ptr - 2 * sizeof(uint16_t)) {
uint8_t len = dns_message->data[dns_message->ptr++]; uint8_t len = dns_message->data[dns_message->ptr++];
if (len > DNS_MAX_DOMAIN_NAME_LEN) { if (len > DNS_MAX_DOMAIN_NAME_LEN) {
flags->rcode = DNS_ERROR_NAME; flags->rcode = DNS_ERROR_NAME;
break; break;
} }
if (!len) { if (!len) {
break; break;
} }
if (dot_count) { if (dot_count) {
if (dot_count > 3) { // Max three dots allowed if (dot_count > 3) { // Max three dots allowed
flags->rcode = DNS_ERROR_NAME; flags->rcode = DNS_ERROR_NAME;
break; break;
} }
dap_string_append(dns_hostname, "."); dap_string_append(dns_hostname, ".");
} }
dap_string_append_len(dns_hostname, &dns_message->data[dns_message->ptr], len); dap_string_append_len(dns_hostname, &dns_message->data[dns_message->ptr], len);
dns_message->ptr += len; dns_message->ptr += len;
dot_count++; dot_count++;
if (dns_hostname->len >= DNS_MAX_HOSTNAME_LEN) { if (dns_hostname->len >= DNS_MAX_HOSTNAME_LEN) {
flags->rcode = DNS_ERROR_NAME; flags->rcode = DNS_ERROR_NAME;
break; break;
} }
} }
val = dap_dns_buf_get_uint16(dns_message); // DNS record type 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) { ...@@ -261,16 +261,16 @@ void dap_dns_client_read(dap_client_remote_t *client, void * arg) {
if (dns_message->ptr != dns_reply->ptr) { 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); 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; uint32_t ip_addr = 0;
if (flags->rcode == DNS_ERROR_NONE) { 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) { if (callback) {
ip_addr = callback(dns_hostname->str); ip_addr = callback(dns_hostname->str);
} }
} }
if (ip_addr) { if (ip_addr) {
// Compose DNS answer // Compose DNS answer
block_len = DNS_ANSWER_SIZE; block_len = DNS_ANSWER_SIZE;
dns_reply->data = DAP_REALLOC(dns_reply->data, dns_reply->ptr + block_len); 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) { ...@@ -284,13 +284,13 @@ void dap_dns_client_read(dap_client_remote_t *client, void * arg) {
dap_dns_buf_put_uint32(dns_reply, ttl); dap_dns_buf_put_uint32(dns_reply, ttl);
val = 4; // RD len for ipv4 val = 4; // RD len for ipv4
dap_dns_buf_put_uint16(dns_reply, val); dap_dns_buf_put_uint16(dns_reply, val);
dap_dns_buf_put_uint32(dns_reply, ip_addr); dap_dns_buf_put_uint32(dns_reply, ip_addr);
} else if (flags->rcode == DNS_ERROR_NONE) { } else if (flags->rcode == DNS_ERROR_NONE) {
flags->rcode = DNS_ERROR_NAME; flags->rcode = DNS_ERROR_NAME;
} }
if (flags->rcode) { if (flags->rcode) {
dns_reply->data[7] = 0; // No answer section dns_reply->data[7] = 0; // No answer section
} }
// Set reply flags // Set reply flags
dns_reply->data[2] = msg_flags.val >> 8; dns_reply->data[2] = msg_flags.val >> 8;
dns_reply->data[3] = msg_flags.val; dns_reply->data[3] = msg_flags.val;
...@@ -310,6 +310,11 @@ void dap_dns_server_start() { ...@@ -310,6 +310,11 @@ void dap_dns_server_start() {
s_dns_server = DAP_NEW(dap_dns_server_t); s_dns_server = DAP_NEW(dap_dns_server_t);
s_dns_server->hash_table = NULL; s_dns_server->hash_table = NULL;
s_dns_server->instance = dap_udp_server_listen(DNS_LISTEN_PORT); 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_read_callback = *dap_dns_client_read;
s_dns_server->instance->client_write_callback = NULL; s_dns_server->instance->client_write_callback = NULL;
s_dns_server->instance->client_new_callback = NULL; s_dns_server->instance->client_new_callback = NULL;
...@@ -326,6 +331,6 @@ void dap_dns_server_stop() { ...@@ -326,6 +331,6 @@ void dap_dns_server_stop() {
DAP_DELETE(current_zone); DAP_DELETE(current_zone);
} }
// TODO add code to stop udp_thread // 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); DAP_DELETE(s_dns_server);
} }
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment