Index: uspace/srv/net/dnsrsrv/dns_msg.c
===================================================================
--- uspace/srv/net/dnsrsrv/dns_msg.c	(revision 1ddbf813558e0219fe54a64fa2f119d339081ee0)
+++ uspace/srv/net/dnsrsrv/dns_msg.c	(revision 20c82e32f14a4b255c34fb739d8439dd790a7db3)
@@ -77,5 +77,5 @@
 		return ENOMEM;
 
-	str_cpy((*dstr) + s1, nsize - s1, suff);
+	str_cpy(nstr + s1, nsize - s1, suff);
 
 	*dstr = nstr;
@@ -195,12 +195,4 @@
 			break;
 
-		if (!first) {
-			rc = dns_dstr_ext(&name, ".");
-			if (rc != EOK) {
-				rc = ENOMEM;
-				goto error;
-			}
-		}
-
 		if ((lsize & 0xc0) == 0xc0) {
 			/* Pointer */
@@ -233,5 +225,6 @@
 			 * the message continues
 			 */
-			*eoff = eptr;
+			if (*eoff == 0)
+				*eoff = eptr;
 
 			bp = pdu->data + ptr;
@@ -243,4 +236,12 @@
 			rc = EINVAL;
 			goto error;
+		}
+
+		if (!first) {
+			rc = dns_dstr_ext(&name, ".");
+			if (rc != EOK) {
+				rc = ENOMEM;
+				goto error;
+			}
 		}
 
@@ -413,5 +414,5 @@
 	rc = dns_name_decode(pdu, boff, &rr->name, &name_eoff);
 	if (rc != EOK) {
-		log_msg(LOG_DEFAULT, LVL_DEBUG, "Error decoding name");
+		log_msg(LOG_DEFAULT, LVL_DEBUG, "dns_rr_decode: error decoding name");
 		free(rr);
 		return ENOMEM;
@@ -421,4 +422,5 @@
 		free(rr->name);
 		free(rr);
+		log_msg(LOG_DEFAULT, LVL_DEBUG, "dns_rr_decode: error name_off");
 		return EINVAL;
 	}
@@ -430,4 +432,5 @@
 		free(rr->name);
 		free(rr);
+		log_msg(LOG_DEFAULT, LVL_DEBUG, "dns_rr_decode: error bsz");
 		return EINVAL;
 	}
@@ -445,4 +448,7 @@
 	bsz -= sizeof(uint32_t);
 
+	log_msg(LOG_DEFAULT, LVL_DEBUG2, "dns_rr_decode: rtype=0x%x, rclass=0x%x, ttl=0x%x",
+	    rr->rtype, rr->rclass, rr->ttl );
+
 	rdlength = dns_uint16_t_decode(bp, bsz);
 	bp += sizeof(uint16_t);
@@ -452,12 +458,15 @@
 		free(rr->name);
 		free(rr);
+		log_msg(LOG_DEFAULT, LVL_DEBUG, "dns_rr_decode: Error rdlength %zu > bsz %zu", rdlength, bsz);
 		return EINVAL;
 	}
 
 	rr->rdata_size = rdlength;
-	rr->rdata = calloc(1, sizeof(rdlength));
+	log_msg(LOG_DEFAULT, LVL_DEBUG2, "dns_rr_decode: rdlength=%zu", rdlength);
+	rr->rdata = calloc(1, rdlength);
 	if (rr->rdata == NULL) {
 		free(rr->name);
 		free(rr);
+		log_msg(LOG_DEFAULT, LVL_DEBUG, "dns_rr_decode: Error memory");
 		return ENOMEM;
 	}
@@ -470,4 +479,5 @@
 	*eoff = bp - pdu->data;
 	*retrr = rr;
+	log_msg(LOG_DEFAULT, LVL_DEBUG2, "dns_rr_decode: done");
 	return EOK;
 }
@@ -586,5 +596,5 @@
 	memcpy(msg->pdu.data, data, size);
 	msg->pdu.size = size;
-	log_msg(LOG_DEFAULT, LVL_NOTE, "dns_message_decode: pdu->data = %p, "
+	log_msg(LOG_DEFAULT, LVL_DEBUG2, "dns_message_decode: pdu->data = %p, "
 	    "pdu->size=%zu", msg->pdu.data, msg->pdu.size);
 
@@ -605,4 +615,6 @@
 
 	qd_count = uint16_t_be2host(hdr->qd_count);
+	log_msg(LOG_DEFAULT, LVL_DEBUG2, "qd_count=%zu", qd_count);
+
 
 	for (i = 0; i < qd_count; i++) {
@@ -618,4 +630,5 @@
 
 	an_count = uint16_t_be2host(hdr->an_count);
+	log_msg(LOG_DEFAULT, LVL_DEBUG2, "an_count=%zu", an_count);
 
 	for (i = 0; i < an_count; i++) {
