From b7aee0704744adf8d22a183c0642e67de0faaca1 Mon Sep 17 00:00:00 2001 From: Morten Stevens Date: Jan 17 2017 13:27:31 +0000 Subject: Fix for building on armv7hl --- diff --git a/fix-negative-ipv6-32bit.patch b/fix-negative-ipv6-32bit.patch new file mode 100644 index 0000000..36e93f1 --- /dev/null +++ b/fix-negative-ipv6-32bit.patch @@ -0,0 +1,54 @@ +From 6cbfa73b35a5cc7325b58625c0698576fb99601f Mon Sep 17 00:00:00 2001 +From: Remi Gacogne +Date: Sun, 15 Jan 2017 21:45:27 +0100 +Subject: [PATCH] Fix negative port detection for IPv6 addresses on 32-bit + +On a 32-bit Arch, our `test_ComboAddress` unit test fails because +`ComboAddress("[::1]:-6")` is considered valid. This is caused by +`stoul()` not throwing for a negative value and returning an `unsigned +long` value using unsigned integer wraparound rules. Since we used to +store the result value in a `signed int` and treat negative values +as if the port was not set, the test failed. +--- + pdns/misc.cc | 12 +++++++----- + 1 file changed, 7 insertions(+), 5 deletions(-) + +diff --git a/pdns/misc.cc b/pdns/misc.cc +index 10912ff..c80b4d5 100644 +--- a/pdns/misc.cc ++++ b/pdns/misc.cc +@@ -710,7 +710,8 @@ int makeIPv6sockaddr(const std::string& addr, struct sockaddr_in6* ret) + if(addr.empty()) + return -1; + string ourAddr(addr); +- int port = -1; ++ bool portSet = false; ++ unsigned int port; + if(addr[0]=='[') { // [::]:53 style address + string::size_type pos = addr.find(']'); + if(pos == string::npos || pos + 2 > addr.size() || addr[pos+1]!=':') +@@ -718,6 +719,7 @@ int makeIPv6sockaddr(const std::string& addr, struct sockaddr_in6* ret) + ourAddr.assign(addr.c_str() + 1, pos-1); + try { + port = pdns_stou(addr.substr(pos+2)); ++ portSet = true; + } + catch(std::out_of_range) { + return -1; +@@ -744,12 +746,12 @@ int makeIPv6sockaddr(const std::string& addr, struct sockaddr_in6* ret) + freeaddrinfo(res); + } + +- if(port > 65535) +- // negative ports are found with the pdns_stou above +- return -1; ++ if(portSet) { ++ if(port > 65535) ++ return -1; + +- if(port >= 0) + ret->sin6_port = htons(port); ++ } + + return 0; + } diff --git a/fix-unit-tests-32bit.patch b/fix-unit-tests-32bit.patch new file mode 100644 index 0000000..54f73e0 --- /dev/null +++ b/fix-unit-tests-32bit.patch @@ -0,0 +1,46 @@ +From 00c6f2b9f5173c98cc883332f5ecf8b941715abc Mon Sep 17 00:00:00 2001 +From: Remi Gacogne +Date: Fri, 13 Jan 2017 14:02:19 +0100 +Subject: [PATCH] Fix AtomicCounter unit tests on 32-bit + +--- + pdns/misc.hh | 3 ++- + pdns/test-statbag_cc.cc | 4 ++-- + 2 files changed, 4 insertions(+), 3 deletions(-) + +diff --git a/pdns/misc.hh b/pdns/misc.hh +index 50e8dca..2e0e65a 100644 +--- a/pdns/misc.hh ++++ b/pdns/misc.hh +@@ -373,7 +373,8 @@ inline bool pdns_iequals_ch(const char a, const char b) + } + + +-typedef std::atomic AtomicCounter ; ++typedef unsigned long AtomicCounterInner; ++typedef std::atomic AtomicCounter ; + + // FIXME400 this should probably go? + struct CIStringCompare: public std::binary_function +diff --git a/pdns/test-statbag_cc.cc b/pdns/test-statbag_cc.cc +index 3330451..4abbcd0 100644 +--- a/pdns/test-statbag_cc.cc ++++ b/pdns/test-statbag_cc.cc +@@ -83,7 +83,7 @@ BOOST_AUTO_TEST_CASE(test_StatBagBasic) { + + #ifdef UINTPTR_MAX + #if UINTPTR_MAX > 0xffffffffULL +- BOOST_CHECK_EQUAL(sizeof(unsigned long), 8); ++ BOOST_CHECK_EQUAL(sizeof(AtomicCounterInner), 8); + s.set("c", 1ULL<<33); + BOOST_CHECK_EQUAL(s.read("c"), (1ULL<<33) ); + s.inc("c"); +@@ -94,7 +94,7 @@ BOOST_AUTO_TEST_CASE(test_StatBagBasic) { + s.inc("c"); + BOOST_CHECK_EQUAL(s.read("c"), 0 ); + #else +- BOOST_CHECK_EQUAL(sizeof(AtomicCounter::native_t), 4); ++ BOOST_CHECK_EQUAL(sizeof(AtomicCounterInner), 4); + BOOST_CHECK_EQUAL(~0UL, 0xffffffffUL); + s.set("c", ~0UL); + BOOST_CHECK_EQUAL(s.read("c"), 0xffffffffUL ); diff --git a/pdns.spec b/pdns.spec index 6a9d97d..90f1442 100644 --- a/pdns.spec +++ b/pdns.spec @@ -3,7 +3,7 @@ Name: pdns Version: 4.0.2 -Release: 1%{?dist} +Release: 2%{?dist} Summary: A modern, advanced and high performance authoritative-only nameserver Group: System Environment/Daemons License: GPLv2 @@ -11,6 +11,8 @@ URL: http://powerdns.com Source0: http://downloads.powerdns.com/releases/%{name}-%{version}.tar.bz2 Source1: pdns.service Patch0: pdns-disable-secpoll.patch +Patch1: fix-unit-tests-32bit.patch +Patch2: fix-negative-ipv6-32bit.patch Requires(pre): shadow-utils Requires(post): systemd-units @@ -151,6 +153,8 @@ This package contains the TinyDNS backend for %{name} %prep %setup -q %patch0 -p1 -b .disable-secpoll +%patch1 -p1 -b .fix-unit-tests-32bit +%patch2 -p1 -b .fix-negative-ipv6-32bit %build export CPPFLAGS="-DLDAP_DEPRECATED" @@ -312,6 +316,9 @@ exit 0 %{_libdir}/%{name}/libtinydnsbackend.so %changelog +* Tue Jan 17 2017 Morten Stevens - 4.0.2-2 +- Fix for building on armv7hl + * Mon Jan 16 2017 Morten Stevens - 4.0.2-1 - Update to 4.0.2 - Security fix for CVE-2016-2120, CVE-2016-7068, CVE-2016-7072, CVE-2016-7073, CVE-2016-7074