Package: release.debian.org
Severity: normal
Tags: wheezy
User: release.debian....@packages.debian.org
Usertags: pu
X-Debbugs-CC: Robert S. Edmonds <edmo...@debian.org>

Dear release team and unbound maintainer,

I would like to NMU unbound to stable, because it crashes when
validating DNSSEC on multiple threads simultaneously. The relevant
Debian bug #691528 is fixed upstream, in unstable and I sent a
backported patch to that bug (also attached for convenience). Is this
patch suitable for wheezy?

Helmut
diff -Nru unbound-1.4.17/debian/changelog unbound-1.4.17/debian/changelog
--- unbound-1.4.17/debian/changelog     2013-02-17 18:35:34.000000000 +0100
+++ unbound-1.4.17/debian/changelog     2014-03-11 17:36:53.000000000 +0100
@@ -1,3 +1,10 @@
+unbound (1.4.17-3+wheezy1) stable-proposed-updates; urgency=low
+
+  * Non-maintainer upload.
+  * Fix crash when using DNSSEC and num-threads > 1; closes: #691528.
+
+ -- Helmut Grohne <hel...@subdivi.de>  Tue, 11 Mar 2014 17:33:23 +0100
+
 unbound (1.4.17-3) testing; urgency=low
 
   * Update IPv4 address hint for D.ROOT-SERVERS.NET.
diff -Nru unbound-1.4.17/debian/patches/series 
unbound-1.4.17/debian/patches/series
--- unbound-1.4.17/debian/patches/series        2013-02-17 18:54:32.000000000 
+0100
+++ unbound-1.4.17/debian/patches/series        2014-03-11 17:27:03.000000000 
+0100
@@ -1 +1,2 @@
 debian-changes
+unbound-1.4.18-openssl-threads.patch
diff -Nru unbound-1.4.17/debian/patches/unbound-1.4.18-openssl-threads.patch 
unbound-1.4.17/debian/patches/unbound-1.4.18-openssl-threads.patch
--- unbound-1.4.17/debian/patches/unbound-1.4.18-openssl-threads.patch  
1970-01-01 01:00:00.000000000 +0100
+++ unbound-1.4.17/debian/patches/unbound-1.4.18-openssl-threads.patch  
2014-03-11 17:31:22.000000000 +0100
@@ -0,0 +1,109 @@
+Description: fix crash when using DNSSEC and num-threads > 1
+Bug-Debian: http://bugs.debian.org/691528
+Last-Update: 2014-03-11
+Applied-Upstream: revision 2733
+
+Index: unbound-1.4.17/daemon/daemon.c
+===================================================================
+--- unbound-1.4.17.orig/daemon/daemon.c        2014-03-11 17:26:28.541719650 
+0100
++++ unbound-1.4.17/daemon/daemon.c     2014-03-11 17:26:32.621688573 +0100
+@@ -203,6 +203,10 @@
+       comp_meth = (void*)SSL_COMP_get_compression_methods();
+ #endif
+       (void)SSL_library_init();
++#  if defined(OPENSSL_THREADS) && !defined(THREADS_DISABLED)
++      if(!ub_openssl_lock_init())
++              fatal_exit("could not init openssl locks");
++#  endif
+ #ifdef HAVE_TZSET
+       /* init timezone info while we are not chrooted yet */
+       tzset();
+@@ -555,6 +559,9 @@
+       ERR_remove_state(0);
+       ERR_free_strings();
+       RAND_cleanup();
++#  if defined(OPENSSL_THREADS) && !defined(THREADS_DISABLED)
++      ub_openssl_lock_delete();
++#  endif
+       checklock_stop();
+ #ifdef USE_WINSOCK
+       if(WSACleanup() != 0) {
+Index: unbound-1.4.17/util/net_help.c
+===================================================================
+--- unbound-1.4.17.orig/util/net_help.c        2014-03-11 17:26:28.541719650 
+0100
++++ unbound-1.4.17/util/net_help.c     2014-03-11 17:26:32.621688573 +0100
+@@ -697,3 +697,54 @@
+       }
+       return ssl;
+ }
++
++/** global lock list for openssl locks */
++static lock_basic_t *ub_openssl_locks = NULL;
++
++/** callback that gets thread id for openssl */
++static unsigned long
++ub_crypto_id_cb(void)
++{
++      return (unsigned long)ub_thread_self();
++}
++
++static void
++ub_crypto_lock_cb(int mode, int type, const char *ATTR_UNUSED(file),
++      int ATTR_UNUSED(line))
++{
++      if((mode&CRYPTO_LOCK)) {
++              lock_basic_lock(&ub_openssl_locks[type]);
++      } else {
++              lock_basic_unlock(&ub_openssl_locks[type]);
++      }
++}
++
++int ub_openssl_lock_init(void)
++{
++#ifdef OPENSSL_THREADS
++      size_t i;
++      ub_openssl_locks = (lock_basic_t*)malloc(
++              sizeof(lock_basic_t)*CRYPTO_num_locks());
++      if(!ub_openssl_locks)
++              return 0;
++      for(i=0; i<CRYPTO_num_locks(); i++) {
++              lock_basic_init(&ub_openssl_locks[i]);
++      }
++      CRYPTO_set_id_callback(&ub_crypto_id_cb);
++      CRYPTO_set_locking_callback(&ub_crypto_lock_cb);
++#endif /* OPENSSL_THREADS */
++      return 1;
++}
++
++void ub_openssl_lock_delete(void)
++{
++#ifdef OPENSSL_THREADS
++      size_t i;
++      if(!ub_openssl_locks)
++              return;
++      for(i=0; i<CRYPTO_num_locks(); i++) {
++              lock_basic_destroy(&ub_openssl_locks[i]);
++      }
++#endif /* OPENSSL_THREADS */
++}
++
+Index: unbound-1.4.17/util/net_help.h
+===================================================================
+--- unbound-1.4.17.orig/util/net_help.h        2014-03-11 17:26:28.541719650 
+0100
++++ unbound-1.4.17/util/net_help.h     2014-03-11 17:26:32.621688573 +0100
+@@ -369,4 +369,15 @@
+  */
+ void* outgoing_ssl_fd(void* sslctx, int fd);
+ 
++/**
++ * Initialize openssl locking for thread safety
++ * @return false on failure (alloc failure).
++ */
++int ub_openssl_lock_init(void);
++
++/**
++ * De-init the allocated openssl locks
++ */
++void ub_openssl_lock_delete(void);
++
+ #endif /* NET_HELP_H */
diff -Nru unbound-1.4.17/debian/source/options 
unbound-1.4.17/debian/source/options
--- unbound-1.4.17/debian/source/options        2013-02-17 18:35:34.000000000 
+0100
+++ unbound-1.4.17/debian/source/options        1970-01-01 01:00:00.000000000 
+0100
@@ -1 +0,0 @@
-single-debian-patch

Reply via email to