mirror of
https://github.com/systemd/systemd
synced 2024-11-05 18:25:39 +00:00
resolved: packet - ensure there is space for IP+UDP headers
Currently we only make sure our links can handle the size of the payload witohut taking the headers into account.
This commit is contained in:
parent
ff89f8b917
commit
a0166609f7
3 changed files with 6 additions and 3 deletions
|
@ -32,10 +32,10 @@ int dns_packet_new(DnsPacket **ret, DnsProtocol protocol, size_t mtu) {
|
|||
|
||||
assert(ret);
|
||||
|
||||
if (mtu <= 0)
|
||||
if (mtu <= UDP_PACKET_HEADER_SIZE)
|
||||
a = DNS_PACKET_SIZE_START;
|
||||
else
|
||||
a = mtu;
|
||||
a = mtu - UDP_PACKET_HEADER_SIZE;
|
||||
|
||||
if (a < DNS_PACKET_HEADER_SIZE)
|
||||
a = DNS_PACKET_HEADER_SIZE;
|
||||
|
|
|
@ -21,6 +21,8 @@
|
|||
along with systemd; If not, see <http://www.gnu.org/licenses/>.
|
||||
***/
|
||||
|
||||
#include <netinet/udp.h>
|
||||
#include <netinet/ip.h>
|
||||
|
||||
#include "macro.h"
|
||||
#include "sparse-endian.h"
|
||||
|
@ -53,6 +55,7 @@ struct DnsPacketHeader {
|
|||
};
|
||||
|
||||
#define DNS_PACKET_HEADER_SIZE sizeof(DnsPacketHeader)
|
||||
#define UDP_PACKET_HEADER_SIZE (sizeof(struct iphdr) + sizeof(struct udphdr))
|
||||
|
||||
/* The various DNS protocols deviate in how large a packet can grow,
|
||||
but the TCP transport has a 16bit size field, hence that appears to
|
||||
|
|
|
@ -160,7 +160,7 @@ int dns_scope_emit(DnsScope *s, DnsPacket *p) {
|
|||
if (p->size > DNS_PACKET_UNICAST_SIZE_MAX)
|
||||
return -EMSGSIZE;
|
||||
|
||||
if (p->size > mtu)
|
||||
if (p->size + UDP_PACKET_HEADER_SIZE > mtu)
|
||||
return -EMSGSIZE;
|
||||
|
||||
if (family == AF_INET)
|
||||
|
|
Loading…
Reference in a new issue