From f3223fbff65d8ae9d67426dce6218fda30dee0cf Mon Sep 17 00:00:00 2001 From: Simon Kelley Date: Tue, 6 Mar 2018 22:55:36 +0000 Subject: [PATCH] Fix nettle_hash() function to avoid ABI incompatibilities. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The way of accessing the list of available hashes on nettle was vulnerable to breaking if the version of libnettle in use was different to the version dnsmasq was compiled against. Change to a new system if libnettle >= 3.4 is in use. Older versions if nettle are still OK, once 3.4 is reached, the ABi problem is fixed. Thanks to Petr Menšík for clues on this. --- debian/changelog | 3 +++ debian/shlibs.local | 1 - src/crypto.c | 18 +++++++++++++----- 3 files changed, 16 insertions(+), 6 deletions(-) delete mode 100644 debian/shlibs.local diff --git a/debian/changelog b/debian/changelog index 40f6805..0ffe556 100644 --- a/debian/changelog +++ b/debian/changelog @@ -5,6 +5,9 @@ dnsmasq (2.79-1) unstable; urgency=low * Fix exit code for dhcp_release6 (closes: #833596) * Add project homepage to control file. (closes: #887764) * New binary package dnsmasq-base-lua, includes Lua support. + * Remove hardwired shlibs dependency for libnettle 3.3 and + fix code to avoid ABI breakage as long as compiled against + libnettle 3.4 or later. (closes: #891315) -- Simon Kelley Fri, 16 Feb 2018 19:54:22 +0000 diff --git a/debian/shlibs.local b/debian/shlibs.local deleted file mode 100644 index 850b717..0000000 --- a/debian/shlibs.local +++ /dev/null @@ -1 +0,0 @@ -libnettle 6 libnettle6 (>= 3.3) diff --git a/src/crypto.c b/src/crypto.c index 16ef1ca..5becfb0 100644 --- a/src/crypto.c +++ b/src/crypto.c @@ -114,17 +114,25 @@ const struct nettle_hash *hash_find(char *name) if (!name) return NULL; + /* We provide a "null" hash which returns the input data as digest. */ + if (strcmp(null_hash.name, name) == 0) + return &null_hash; + + /* libnettle >= 3.4 provides nettle_lookup_hash() which avoids nasty ABI + incompatibilities if sizeof(nettle_hashes) changes between library + versions. */ + +#if (NETTLE_VERSION_MAJOR>3) || ((NETTLE_VERSION_MAJOR==3) && (NETTLE_VERSION_MINOR >=4)) + return nettle_lookup_hash(name); +#else for (i = 0; nettle_hashes[i]; i++) { if (strcmp(nettle_hashes[i]->name, name) == 0) return nettle_hashes[i]; } - /* We provide a "null" hash which returns the input data as digest. */ - if (strcmp(null_hash.name, name) == 0) - return &null_hash; - - return NULL; + return NULL; +#endif } /* expand ctx and digest memory allocations if necessary and init hash function */