From ab0a9b91bd1f469eb14fb86162f7b800efca3583 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Eckl=2C=20M=C3=A1t=C3=A9?= <ecklm94@gmail.com>
Date: Thu, 26 May 2016 23:28:40 +0200
Subject: [PATCH] =?UTF-8?q?Rejt=C3=A9lyes=20segfault=20jav=C3=ADt=C3=A1sa?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

Tanúlság: (#13)
---
 include/udp_packet_wp.h |  2 +-
 src/dns_server.cpp      |  2 ++
 src/udp_packet_wp.cpp   | 27 ++++++++++++++++++---------
 src/udp_socket_wp.cpp   |  5 ++---
 4 files changed, 23 insertions(+), 13 deletions(-)

diff --git a/include/udp_packet_wp.h b/include/udp_packet_wp.h
index acd7520..c298524 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 fbcc13b..e2fdaaa 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 52f877c..d058002 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 051f57f..a61dbdd 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;
 }
-- 
GitLab