--- /dev/null
+diff -dur unbound-1.5.1.orig/services/listen_dnsport.c unbound-1.5.1/services/listen_dnsport.c
+--- unbound-1.5.1.orig/services/listen_dnsport.c 2014-09-16 15:49:21.000000000 +0200
++++ unbound-1.5.1/services/listen_dnsport.c 2014-12-18 10:37:55.000000000 +0100
+@@ -368,19 +368,20 @@
+ * (and also uses the interface mtu to determine the size of the packets).
+ * So there won't be any EMSGSIZE error. Against DNS fragmentation attacks.
+ * FreeBSD already has same semantics without setting the option. */
++ int action, result = -1;
+ # if defined(IP_PMTUDISC_OMIT)
+- int action = IP_PMTUDISC_OMIT;
+-# else
+- int action = IP_PMTUDISC_DONT;
++ action = IP_PMTUDISC_OMIT;
++ result = setsockopt(s, IPPROTO_IP, IP_MTU_DISCOVER,
++ &action, (socklen_t)sizeof(action));
+ # endif
+- if (setsockopt(s, IPPROTO_IP, IP_MTU_DISCOVER,
+- &action, (socklen_t)sizeof(action)) < 0) {
++ if (result < 0) {
++ action = IP_PMTUDISC_DONT;
++ result = setsockopt(s, IPPROTO_IP, IP_MTU_DISCOVER,
++ &action, (socklen_t)sizeof(action));
++ }
++ if (result < 0) {
+ log_err("setsockopt(..., IP_MTU_DISCOVER, "
+-# if defined(IP_PMTUDISC_OMIT)
+- "IP_PMTUDISC_OMIT"
+-# else
+ "IP_PMTUDISC_DONT"
+-# endif
+ "...) failed: %s",
+ strerror(errno));
+ # ifndef USE_WINSOCK