diff --git a/dns.c b/dns.c index a5ed106..2692850 100644 --- a/dns.c +++ b/dns.c @@ -324,8 +324,8 @@ dns_parse_reply(char *outbuf, int buflen, char *packet, int packetlen) } if(type == T_NULL && rlen > 2) { - memcpy(outbuf, rdata, rlen); - rv = rlen; + rv = MIN(rlen, sizeof(rdata)); + memcpy(outbuf, rdata, rv); } } @@ -429,7 +429,7 @@ dnsd_read(int fd, struct query *q, char *buf, int buflen) short class; short qdcount; char *data; - char name[255]; + char name[257]; HEADER *header; socklen_t addrlen; char packet[64*1024]; @@ -449,11 +449,12 @@ dnsd_read(int fd, struct query *q, char *buf, int buflen) qdcount = ntohs(header->qdcount); if(qdcount == 1) { - readname(packet, &data, name, sizeof(name)); + readname(packet, &data, name, sizeof(name) -1); + name[256] = 0; readshort(packet, &data, &type); readshort(packet, &data, &class); - strncpy(q->name, name, 256); + strncpy(q->name, name, 257); q->type = type; q->id = id; q->fromlen = addrlen; diff --git a/structs.h b/structs.h index 2cec05c..534f59c 100644 --- a/structs.h +++ b/structs.h @@ -25,7 +25,7 @@ struct packet }; struct query { - char name[256]; + char name[258]; short type; short id; struct sockaddr from;