diff --git a/CHANGELOG b/CHANGELOG index 4eaacac..3f89ba2 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -14,6 +14,7 @@ CHANGES: - All received error messages (RCODE field) are echoed - Top domain limited to 128 chars - Case preservation check sent after login to decide codec + - Fixed crash on incoming NULL query in server with bad top domain 2007-03-25: 0.4.0 "Run Home" - Added multiuser support (up to 8 users simultaneously) diff --git a/src/iodined.c b/src/iodined.c index 386b908..ddfff0a 100644 --- a/src/iodined.c +++ b/src/iodined.c @@ -379,10 +379,14 @@ read_dns(int fd, struct query *q, char *buf, int buflen) if (r > 0) { dns_decode(buf, buflen, q, QR_QUERY, packet, r); domain = strstr(q->name, topdomain); - rv = (int) (domain - q->name); - memcpy(buf, q->name, MIN(rv, buflen)); - q->fromlen = addrlen; - memcpy((struct sockaddr*)&q->from, (struct sockaddr*)&from, addrlen); + if (domain) { + rv = (int) (domain - q->name); + memcpy(buf, q->name, MIN(rv, buflen)); + q->fromlen = addrlen; + memcpy((struct sockaddr*)&q->from, (struct sockaddr*)&from, addrlen); + } else { + rv = 0; + } } else if (r < 0) { /* Error */ perror("recvfrom");