Skip to content

Commit

Permalink
DNSTAP
Browse files Browse the repository at this point in the history
- `dnstap`: Move DNSTAP essential attributes checks inside each type and customize them for that specific type
  • Loading branch information
jelu committed Mar 28, 2023
1 parent 91f0de7 commit abfe245
Showing 1 changed file with 73 additions and 29 deletions.
102 changes: 73 additions & 29 deletions src/dnstap.c
Original file line number Diff line number Diff line change
Expand Up @@ -520,27 +520,22 @@ static int _set_addr(inX_addr* addr, const uint8_t* data, const size_t len)

static int dnstap_handler(const struct dnstap* m)
{
transport_message tm;

if (!dnstap_message_has_socket_family(*m)
|| !dnstap_message_has_socket_protocol(*m)
|| (dnstap_message_has_query_message(*m) && (!dnstap_message_has_query_time_sec(*m) || !dnstap_message_has_query_time_nsec(*m)))
|| (dnstap_message_has_response_message(*m) && (!dnstap_message_has_response_time_sec(*m) || !dnstap_message_has_response_time_nsec(*m)))
|| (dnstap_message_has_query_port(*m) && !dnstap_message_has_query_address(*m))
|| (dnstap_message_has_response_port(*m) && !dnstap_message_has_response_address(*m))) {
dsyslog(LOG_ERR, "DNSTAP: Missing critical part(s) of DNSTAP message to be able to process");
return -1;
}

memset(&tm, 0, sizeof(tm));
transport_message tm = {};

_print_dnstap(m);

switch (dnstap_message_type(*m)) {
case DNSTAP_MESSAGE_TYPE_AUTH_QUERY:
case DNSTAP_MESSAGE_TYPE_UPDATE_QUERY:
if (!dnstap_message_has_query_message(*m) || !dnstap_message_has_query_address(*m)) {
dsyslogf(LOG_ERR, "DNSTAP: Missing parts of %s", DNSTAP_MESSAGE_TYPE_STRING[dnstap_message_type(*m)]);
if (!dnstap_message_has_socket_family(*m)
|| !dnstap_message_has_socket_protocol(*m)
|| !dnstap_message_has_query_message(*m)
|| !dnstap_message_has_query_address(*m)
|| !dnstap_message_has_query_port(*m)
|| !dnstap_message_has_query_time_sec(*m)
|| !dnstap_message_has_query_time_nsec(*m)
|| (dnstap_message_has_response_address(*m) && !dnstap_message_has_response_port(*m))) {
dsyslogf(LOG_ERR, "DNSTAP: Missing essential parts of %s to be able to process", DNSTAP_MESSAGE_TYPE_STRING[dnstap_message_type(*m)]);
break;
}

Expand Down Expand Up @@ -574,8 +569,15 @@ static int dnstap_handler(const struct dnstap* m)

case DNSTAP_MESSAGE_TYPE_AUTH_RESPONSE:
case DNSTAP_MESSAGE_TYPE_UPDATE_RESPONSE:
if (!dnstap_message_has_response_message(*m) || !dnstap_message_has_query_address(*m)) {
dsyslogf(LOG_ERR, "DNSTAP: Missing parts of %s", DNSTAP_MESSAGE_TYPE_STRING[dnstap_message_type(*m)]);
if (!dnstap_message_has_socket_family(*m)
|| !dnstap_message_has_socket_protocol(*m)
|| !dnstap_message_has_response_message(*m)
|| !dnstap_message_has_query_address(*m)
|| !dnstap_message_has_query_port(*m)
|| !dnstap_message_has_response_time_sec(*m)
|| !dnstap_message_has_response_time_nsec(*m)
|| (dnstap_message_has_response_address(*m) && !dnstap_message_has_response_port(*m))) {
dsyslogf(LOG_ERR, "DNSTAP: Missing essential parts of %s to be able to process", DNSTAP_MESSAGE_TYPE_STRING[dnstap_message_type(*m)]);
break;
}

Expand Down Expand Up @@ -608,8 +610,15 @@ static int dnstap_handler(const struct dnstap* m)
break;

case DNSTAP_MESSAGE_TYPE_RESOLVER_QUERY:
if (!dnstap_message_has_query_message(*m) || !dnstap_message_has_response_address(*m)) {
dsyslogf(LOG_ERR, "DNSTAP: Missing parts of %s", DNSTAP_MESSAGE_TYPE_STRING[dnstap_message_type(*m)]);
if (!dnstap_message_has_socket_family(*m)
|| !dnstap_message_has_socket_protocol(*m)
|| !dnstap_message_has_query_message(*m)
|| !dnstap_message_has_response_address(*m)
|| !dnstap_message_has_response_port(*m)
|| !dnstap_message_has_query_time_sec(*m)
|| !dnstap_message_has_query_time_nsec(*m)
|| (dnstap_message_has_query_address(*m) && !dnstap_message_has_query_port(*m))) {
dsyslogf(LOG_ERR, "DNSTAP: Missing essential parts of %s to be able to process", DNSTAP_MESSAGE_TYPE_STRING[dnstap_message_type(*m)]);
break;
}

Expand Down Expand Up @@ -642,8 +651,15 @@ static int dnstap_handler(const struct dnstap* m)
break;

case DNSTAP_MESSAGE_TYPE_RESOLVER_RESPONSE:
if (!dnstap_message_has_response_message(*m) || !dnstap_message_has_response_address(*m)) {
dsyslogf(LOG_ERR, "DNSTAP: Missing parts of %s", DNSTAP_MESSAGE_TYPE_STRING[dnstap_message_type(*m)]);
if (!dnstap_message_has_socket_family(*m)
|| !dnstap_message_has_socket_protocol(*m)
|| !dnstap_message_has_response_message(*m)
|| !dnstap_message_has_response_address(*m)
|| !dnstap_message_has_response_port(*m)
|| !dnstap_message_has_response_time_sec(*m)
|| !dnstap_message_has_response_time_nsec(*m)
|| (dnstap_message_has_query_address(*m) && !dnstap_message_has_query_port(*m))) {
dsyslogf(LOG_ERR, "DNSTAP: Missing essential parts of %s to be able to process", DNSTAP_MESSAGE_TYPE_STRING[dnstap_message_type(*m)]);
break;
}

Expand Down Expand Up @@ -676,8 +692,15 @@ static int dnstap_handler(const struct dnstap* m)
break;

case DNSTAP_MESSAGE_TYPE_CLIENT_QUERY:
if (!dnstap_message_has_query_message(*m) || !dnstap_message_has_query_address(*m)) {
dsyslogf(LOG_ERR, "DNSTAP: Missing parts of %s", DNSTAP_MESSAGE_TYPE_STRING[dnstap_message_type(*m)]);
if (!dnstap_message_has_socket_family(*m)
|| !dnstap_message_has_socket_protocol(*m)
|| !dnstap_message_has_query_message(*m)
|| !dnstap_message_has_query_address(*m)
|| !dnstap_message_has_query_port(*m)
|| !dnstap_message_has_query_time_sec(*m)
|| !dnstap_message_has_query_time_nsec(*m)
|| (dnstap_message_has_response_address(*m) && !dnstap_message_has_response_port(*m))) {
dsyslogf(LOG_ERR, "DNSTAP: Missing essential parts of %s to be able to process", DNSTAP_MESSAGE_TYPE_STRING[dnstap_message_type(*m)]);
break;
}

Expand Down Expand Up @@ -710,8 +733,15 @@ static int dnstap_handler(const struct dnstap* m)
break;

case DNSTAP_MESSAGE_TYPE_CLIENT_RESPONSE:
if (!dnstap_message_has_response_message(*m) || !dnstap_message_has_query_address(*m)) {
dsyslogf(LOG_ERR, "DNSTAP: Missing parts of %s", DNSTAP_MESSAGE_TYPE_STRING[dnstap_message_type(*m)]);
if (!dnstap_message_has_socket_family(*m)
|| !dnstap_message_has_socket_protocol(*m)
|| !dnstap_message_has_response_message(*m)
|| !dnstap_message_has_query_address(*m)
|| !dnstap_message_has_query_port(*m)
|| !dnstap_message_has_response_time_sec(*m)
|| !dnstap_message_has_response_time_nsec(*m)
|| (dnstap_message_has_response_address(*m) && !dnstap_message_has_response_port(*m))) {
dsyslogf(LOG_ERR, "DNSTAP: Missing essential parts of %s to be able to process", DNSTAP_MESSAGE_TYPE_STRING[dnstap_message_type(*m)]);
break;
}

Expand Down Expand Up @@ -746,8 +776,15 @@ static int dnstap_handler(const struct dnstap* m)
case DNSTAP_MESSAGE_TYPE_STUB_QUERY:
case DNSTAP_MESSAGE_TYPE_FORWARDER_QUERY:
case DNSTAP_MESSAGE_TYPE_TOOL_QUERY:
if (!dnstap_message_has_query_message(*m) || !dnstap_message_has_response_address(*m)) {
dsyslogf(LOG_ERR, "DNSTAP: Missing parts of %s", DNSTAP_MESSAGE_TYPE_STRING[dnstap_message_type(*m)]);
if (!dnstap_message_has_socket_family(*m)
|| !dnstap_message_has_socket_protocol(*m)
|| !dnstap_message_has_query_message(*m)
|| !dnstap_message_has_response_address(*m)
|| !dnstap_message_has_response_port(*m)
|| !dnstap_message_has_query_time_sec(*m)
|| !dnstap_message_has_query_time_nsec(*m)
|| (dnstap_message_has_query_address(*m) && !dnstap_message_has_query_port(*m))) {
dsyslogf(LOG_ERR, "DNSTAP: Missing essential parts of %s to be able to process", DNSTAP_MESSAGE_TYPE_STRING[dnstap_message_type(*m)]);
break;
}

Expand Down Expand Up @@ -782,8 +819,15 @@ static int dnstap_handler(const struct dnstap* m)
case DNSTAP_MESSAGE_TYPE_STUB_RESPONSE:
case DNSTAP_MESSAGE_TYPE_FORWARDER_RESPONSE:
case DNSTAP_MESSAGE_TYPE_TOOL_RESPONSE:
if (!dnstap_message_has_response_message(*m) || !dnstap_message_has_response_address(*m)) {
dsyslogf(LOG_ERR, "DNSTAP: Missing parts of %s", DNSTAP_MESSAGE_TYPE_STRING[dnstap_message_type(*m)]);
if (!dnstap_message_has_socket_family(*m)
|| !dnstap_message_has_socket_protocol(*m)
|| !dnstap_message_has_response_message(*m)
|| !dnstap_message_has_response_address(*m)
|| !dnstap_message_has_response_port(*m)
|| !dnstap_message_has_response_time_sec(*m)
|| !dnstap_message_has_response_time_nsec(*m)
|| (dnstap_message_has_query_address(*m) && !dnstap_message_has_query_port(*m))) {
dsyslogf(LOG_ERR, "DNSTAP: Missing essential parts of %s to be able to process", DNSTAP_MESSAGE_TYPE_STRING[dnstap_message_type(*m)]);
break;
}

Expand Down

0 comments on commit abfe245

Please sign in to comment.