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; }