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