X-Git-Url: https://git.octo.it/?a=blobdiff_plain;f=src%2Futils_dns.c;h=25ef18998bb9f62ad928130e49b531f71501f15f;hb=61a1fa91ba73e4fe3a34949f77c5f017056f2b7a;hp=a412809fab051c77c718b158b623f813a2cbf49e;hpb=14b7c735bf93b5a6260a0e064bccc28dc7581c7f;p=collectd.git diff --git a/src/utils_dns.c b/src/utils_dns.c index a412809f..9a2e479c 100644 --- a/src/utils_dns.c +++ b/src/utils_dns.c @@ -33,7 +33,11 @@ * Florian octo Forster */ +#define _BSD_SOURCE + #include "collectd.h" +#include "plugin.h" +#include "common.h" #if HAVE_NETINET_IN_SYSTM_H # include @@ -335,9 +339,7 @@ rfc1035NameUnpack(const char *buf, size_t sz, off_t * off, char *name, size_t ns } static int -handle_dns(const char *buf, int len, - const struct in6_addr *s_addr, - const struct in6_addr *d_addr) +handle_dns(const char *buf, int len) { rfc1035_header_t qh; uint16_t us; @@ -354,7 +356,6 @@ handle_dns(const char *buf, int len, memcpy(&us, buf + 2, 2); us = ntohs(us); - fprintf (stderr, "Bytes 0, 1: 0x%04hx\n", us); qh.qr = (us >> 15) & 0x01; qh.opcode = (us >> 11) & 0x0F; qh.aa = (us >> 10) & 0x01; @@ -384,13 +385,13 @@ handle_dns(const char *buf, int len, if (0 != x) return 0; if ('\0' == qh.qname[0]) - strcpy(qh.qname, "."); + sstrncpy (qh.qname, ".", sizeof (qh.qname)); while ((t = strchr(qh.qname, '\n'))) *t = ' '; while ((t = strchr(qh.qname, '\r'))) *t = ' '; for (t = qh.qname; *t; t++) - *t = tolower(*t); + *t = tolower((int) *t); memcpy(&us, buf + offset, 2); qh.qtype = ntohs(us); @@ -411,16 +412,14 @@ handle_dns(const char *buf, int len, } static int -handle_udp(const struct udphdr *udp, int len, - const struct in6_addr *s_addr, - const struct in6_addr *d_addr) +handle_udp(const struct udphdr *udp, int len) { char buf[PCAP_SNAPLEN]; if ((ntohs (udp->UDP_DEST) != 53) && (ntohs (udp->UDP_SRC) != 53)) return 0; memcpy(buf, udp + 1, len - sizeof(*udp)); - if (0 == handle_dns(buf, len - sizeof(*udp), s_addr, d_addr)) + if (0 == handle_dns(buf, len - sizeof(*udp))) return 0; return 1; } @@ -429,17 +428,18 @@ static int handle_ipv6 (struct ip6_hdr *ipv6, int len) { char buf[PCAP_SNAPLEN]; - int offset; + unsigned int offset; int nexthdr; struct in6_addr s_addr; - struct in6_addr d_addr; uint16_t payload_len; + if (0 > len) + return (0); + offset = sizeof (struct ip6_hdr); nexthdr = ipv6->ip6_nxt; s_addr = ipv6->ip6_src; - d_addr = ipv6->ip6_dst; payload_len = ntohs (ipv6->ip6_plen); if (ignore_list_match (&s_addr)) @@ -459,7 +459,7 @@ handle_ipv6 (struct ip6_hdr *ipv6, int len) uint16_t ext_hdr_len; /* Catch broken packets */ - if ((offset + sizeof (struct ip6_ext)) > len) + if ((offset + sizeof (struct ip6_ext)) > (unsigned int)len) return (0); /* Cannot handle fragments. */ @@ -479,7 +479,7 @@ handle_ipv6 (struct ip6_hdr *ipv6, int len) } /* while */ /* Catch broken and empty packets */ - if (((offset + payload_len) > len) + if (((offset + payload_len) > (unsigned int)len) || (payload_len == 0) || (payload_len > PCAP_SNAPLEN)) return (0); @@ -488,7 +488,7 @@ handle_ipv6 (struct ip6_hdr *ipv6, int len) return (0); memcpy (buf, (char *) ipv6 + offset, payload_len); - if (handle_udp ((struct udphdr *) buf, payload_len, &s_addr, &d_addr) == 0) + if (handle_udp ((struct udphdr *) buf, payload_len) == 0) return (0); return (1); /* Success */ @@ -512,7 +512,7 @@ handle_ip(const struct ip *ip, int len) if (IPPROTO_UDP != ip->ip_p) return 0; memcpy(buf, (void *) ip + offset, len - offset); - if (0 == handle_udp((struct udphdr *) buf, len - offset, &s_addr, &d_addr)) + if (0 == handle_udp((struct udphdr *) buf, len - offset)) return 0; return 1; } @@ -620,7 +620,7 @@ handle_linux_sll (const u_char *pkt, int len) } *hdr; uint16_t etype; - if (len < sizeof (struct sll_header)) + if ((0 > len) || ((unsigned int)len < sizeof (struct sll_header))) return (0); hdr = (struct sll_header *) pkt; @@ -645,7 +645,7 @@ void handle_pcap(u_char *udata, const struct pcap_pkthdr *hdr, const u_char *pkt { int status; - fprintf (stderr, "handle_pcap (udata = %p, hdr = %p, pkt = %p): hdr->caplen = %i\n", + DEBUG ("handle_pcap (udata = %p, hdr = %p, pkt = %p): hdr->caplen = %i\n", (void *) udata, (void *) hdr, (void *) pkt, hdr->caplen); @@ -682,7 +682,7 @@ void handle_pcap(u_char *udata, const struct pcap_pkthdr *hdr, const u_char *pkt break; default: - fprintf (stderr, "unsupported data link type %d\n", + ERROR ("handle_pcap: unsupported data link type %d\n", pcap_datalink(pcap_obj)); status = 0; break; @@ -701,7 +701,7 @@ const char *qtype_str(int t) { static char buf[32]; switch (t) { -#if (defined (__NAMESER)) && (__NAMESER >= 19991006) +#if (defined (__NAMESER)) && (__NAMESER >= 19991001) case ns_t_a: return ("A"); case ns_t_ns: return ("NS"); case ns_t_md: return ("MD"); @@ -743,7 +743,9 @@ const char *qtype_str(int t) case ns_t_dname: return ("DNAME"); case ns_t_sink: return ("SINK"); case ns_t_opt: return ("OPT"); +# if __NAMESER >= 19991006 case ns_t_tsig: return ("TSIG"); +# endif case ns_t_ixfr: return ("IXFR"); case ns_t_axfr: return ("AXFR"); case ns_t_mailb: return ("MAILB"); @@ -810,8 +812,7 @@ const char *qtype_str(int t) case T_ANY: return ("ANY"); /* ... 255 */ #endif /* __BIND >= 19950621 */ default: - snprintf (buf, 32, "#%i", t); - buf[31] = '\0'; + ssnprintf (buf, sizeof (buf), "#%i", t); return (buf); }; /* switch (t) */ /* NOTREACHED */ @@ -838,7 +839,7 @@ const char *opcode_str (int o) return "Update"; break; default: - snprintf(buf, 30, "Opcode%d", o); + ssnprintf(buf, sizeof (buf), "Opcode%d", o); return buf; } /* NOTREACHED */ @@ -882,8 +883,7 @@ const char *rcode_str (int rcode) #endif /* RFC2136 rcodes */ #endif /* __BIND >= 19950621 */ default: - snprintf (buf, 32, "RCode%i", rcode); - buf[31] = '\0'; + ssnprintf (buf, sizeof (buf), "RCode%i", rcode); return (buf); } /* Never reached */