| From 88795538726a5bbfd9efc13d441cb05e1d7fc139 Mon Sep 17 00:00:00 2001 |
| From: =?UTF-8?q?Zbigniew=20J=C4=99drzejewski-Szmek?= <zbyszek@in.waw.pl> |
| Date: Tue, 27 Jun 2017 14:20:00 -0400 |
| Subject: [PATCH 2/3] resolved: do not allocate packets with minimum size |
| |
| dns_packet_new() is sometimes called with mtu == 0, and in that case we should |
| allocate more than the absolute minimum (which is the dns packet header size), |
| otherwise we have to resize immediately again after appending the first data to |
| the packet. |
| |
| This partially reverts the previous commit. |
| --- |
| src/resolve/resolved-dns-packet.c | 12 +++++++++++- |
| 1 file changed, 11 insertions(+), 1 deletion(-) |
| |
| diff --git a/src/resolve/resolved-dns-packet.c b/src/resolve/resolved-dns-packet.c |
| index 821b66e26..d1f0f760a 100644 |
| --- a/src/resolve/resolved-dns-packet.c |
| +++ b/src/resolve/resolved-dns-packet.c |
| @@ -28,6 +28,9 @@ |
| |
| #define EDNS0_OPT_DO (1<<15) |
| |
| +#define DNS_PACKET_SIZE_START 512 |
| +assert_cc(DNS_PACKET_SIZE_START > UDP_PACKET_HEADER_SIZE) |
| + |
| typedef struct DnsPacketRewinder { |
| DnsPacket *packet; |
| size_t saved_rindex; |
| @@ -47,7 +50,14 @@ int dns_packet_new(DnsPacket **ret, DnsProtocol protocol, size_t mtu) { |
| |
| assert(ret); |
| |
| - a = MAX(mtu, DNS_PACKET_HEADER_SIZE); |
| + /* When dns_packet_new() is called with mtu == 0, allocate more than the |
| + * absolute minimum (which is the dns packet header size), to avoid |
| + * resizing immediately again after appending the first data to the packet. |
| + */ |
| + if (mtu < UDP_PACKET_HEADER_SIZE) |
| + a = DNS_PACKET_SIZE_START; |
| + else |
| + a = MAX(mtu, DNS_PACKET_HEADER_SIZE); |
| |
| /* round up to next page size */ |
| a = PAGE_ALIGN(ALIGN(sizeof(DnsPacket)) + a) - ALIGN(sizeof(DnsPacket)); |
| -- |
| 2.14.0.rc1.383.gd1ce394fe2-goog |
| |