diff --git a/include/udp_packet_wp.h b/include/udp_packet_wp.h
index acd75207085333e37c781fca472d73fb9c736dce..c298524d93faf7bea7bbdae943d8fc3ee6be4ea4 100644
--- a/include/udp_packet_wp.h
+++ b/include/udp_packet_wp.h
@@ -20,7 +20,7 @@ class udp_packet_wp
 	char *buf; /** The content of the UDP packet. */
 	size_t buf_len; /** The length of the content in the packet buffer. */
 protected:
-	void set_buf_len(const size_t new_buf_len);
+	void set_buf_len(const ssize_t new_buf_len);
 public:
 	general_sockaddr_wp address;
 
diff --git a/src/dns_server.cpp b/src/dns_server.cpp
index fbcc13b4ffc98fedd7f2787828209b2295375c94..e2fdaaaa3adebfca6cecdff6b1d824d551840773 100644
--- a/src/dns_server.cpp
+++ b/src/dns_server.cpp
@@ -76,6 +76,8 @@ void dns_server::serve_one_request() {
 	socklen_t slen = sizeof(sender);
 	dns_message_em query;
 	udp_packet_wp received_packet = this->socket.recvfrom_wp((sockaddr*) &sender, &slen);
+	if(received_packet.get_buf_len() <= 0)
+		return;
 	try {
 		received_packet>>query;
 	}
diff --git a/src/udp_packet_wp.cpp b/src/udp_packet_wp.cpp
index 52f877cc77d518ce25263c1f1e5f688e5422eb99..d0580026efde166cd3fa01e0f8fd4f29af6b3701 100644
--- a/src/udp_packet_wp.cpp
+++ b/src/udp_packet_wp.cpp
@@ -7,14 +7,21 @@ udp_packet_wp::udp_packet_wp(): buf_len(0) {
 	buf = new char[MAX_UDP_PACKET_SIZE_BYTES];
 }
 
-udp_packet_wp::udp_packet_wp(const udp_packet_wp& other): buf_len(other.buf_len) {
+udp_packet_wp::udp_packet_wp(const udp_packet_wp& other) {
+	set_buf_len(other.buf_len);
 	buf = new char[MAX_UDP_PACKET_SIZE_BYTES];
-	memcpy(buf, other.buf, buf_len);
+	if(buf_len > 0 && buf_len < MAX_UDP_PACKET_SIZE_BYTES)
+		memcpy(buf, other.buf, buf_len);
+	else
+		memset(buf, 0, MAX_UDP_PACKET_SIZE_BYTES);
 }
 
 udp_packet_wp& udp_packet_wp::operator=(const udp_packet_wp& other) {
-	buf_len = other.buf_len;
-	memcpy(buf, other.buf, buf_len);
+	set_buf_len(other.buf_len);
+	if(buf_len > 0 && buf_len < MAX_UDP_PACKET_SIZE_BYTES)
+		memcpy(buf, other.buf, buf_len);
+	else
+		memset(buf, 0, MAX_UDP_PACKET_SIZE_BYTES);
 	return *this;
 }
 
@@ -23,23 +30,25 @@ udp_packet_wp::~udp_packet_wp() {
 		delete[] buf;
 }
 
-void udp_packet_wp::set_buf_len(const size_t new_buf_len) {
+void udp_packet_wp::set_buf_len(const ssize_t new_buf_len) {
 	if(new_buf_len>MAX_UDP_PACKET_SIZE_BYTES) {
 		// May throw some exception...
 		buf_len = MAX_UDP_PACKET_SIZE_BYTES;
-		return;
 	}
-	buf_len = new_buf_len;
+	else if(new_buf_len < 0)
+		buf_len = 0;
+	else
+		buf_len = new_buf_len;
 }
 
 void udp_packet_wp::set_buf(const char *new_buf, const ssize_t new_buf_len) {
 	set_buf_len(new_buf_len);
-	if(new_buf_len <= 0 || new_buf == NULL)
+	if(buf_len <= 0 || new_buf == NULL)
 	{
 		memset(buf, 0, MAX_UDP_PACKET_SIZE_BYTES);
 	}
 	else
 	{
-		memcpy(buf, new_buf, new_buf_len);
+		memcpy(buf, new_buf, buf_len);
 	}
 }
diff --git a/src/udp_socket_wp.cpp b/src/udp_socket_wp.cpp
index 051f57fa4a1cab25f09e9188661a590f5545efb5..a61dbddae0dd1fa15bb1b26ae5a8fa828fe3b0c8 100644
--- a/src/udp_socket_wp.cpp
+++ b/src/udp_socket_wp.cpp
@@ -56,9 +56,8 @@ udp_packet_wp udp_socket_wp::recvfrom_wp(sockaddr *sender_address, socklen_t* se
 			PERROR_ON_DEMAND("recvfrom");
 		msg.set_buf(NULL, 0);
 	}
-//	else
-//		log_on_demand(LOG_DEBUG, "len: %d", len);
-	msg.set_buf(buf, len);
+	else
+		msg.set_buf(buf, len);
 	msg.address.set_sockaddr(sender_address, (sender_address_len != NULL) ? *sender_address_len : 0);
 	return msg;
 }