data += ntohs(head->len);
break;
}
+ case DNS_RECORD_TYPE_TXT:
+ {
+ data += sizeof(DNSAnswerHeader);
+
+ if (input + input_len < data + ntohs(head->len)) {
+ SCLogDebug("input buffer too small for data of len %u", ntohs(head->len));
+ goto insufficient_data;
+ }
+
+ uint16_t datalen = ntohs(head->len);
+ uint8_t txtlen = *data;
+ const uint8_t *tdata = data + 1;
+
+ do {
+ //PrintRawDataFp(stdout, (uint8_t*)tdata, txtlen);
+
+ if (txtlen > datalen)
+ goto bad_data;
+
+ DNSStoreAnswerInState(dns_state, list, fqdn, fqdn_len,
+ ntohs(head->type), ntohs(head->class), ntohl(head->ttl),
+ (uint8_t*)tdata, (uint16_t)txtlen, ntohs(dns_header->tx_id));
+
+ datalen -= txtlen;
+ tdata += txtlen;
+ txtlen = *tdata;
+
+ tdata++;
+ datalen--;
+
+ SCLogDebug("datalen %u, txtlen %u", datalen, txtlen);
+ } while (datalen > 1);
+
+ data += ntohs(head->len);
+ break;
+ }
default: /* unsupported record */
{
data += sizeof(DNSAnswerHeader);
}
}
return data;
+bad_data:
insufficient_data:
return NULL;
}