scdaemon coredumps

Yuriy M. Kaminskiy yumkam at gmail.com
Tue May 30 14:09:18 CEST 2017


When I tried to rebuild gnupg2 2.1.21-2 debian package from
experimental in pbuilder, I got a number of sigsegv's from scdaemon
while running tests:

XXX XX XX:22:40 $host kernel: pipe-connection[14829]: segfault at 24 ip 
00000
000f7652da6 sp 00000000f7498040 error 4 in 
libpthread-2.19.so[f764a000+17000]
XXX XX XX:22:46 $host kernel: pipe-connection[14975]: segfault at 24 ip 
00000
000f7634da6 sp 00000000f747a040 error 4 in 
libpthread-2.19.so[f762c000+17000]
(and a lot more).

Annoyingly, test-suite does not catch this as error, it has not left any 
core, and name of executable was masked, so after twiddling here and
there, I got core and discovered that scdaemon dies when it tries to use
libusb after libusb intiialization failed:

(gdb) bt
#0  __GI___pthread_mutex_lock (mutex=0x18) at 
../nptl/pthread_mutex_lock.c:66
#1  0xf7e61cb6 in libusb_get_device_list (ctx=0x0,
     list=0x565c7800 <ccid_usb_dev_list>) at ../../libusb/core.c:671
#2  0x56567a53 in ccid_dev_scan (idx_max_p=0xf7301514, t_p=0xf7301508)
     at ../../scd/ccid-driver.c:1301
#3  0x56563fad in apdu_dev_list_start (portstr=0x0, l_p=0xf7cc61cc)
     at ../../scd/apdu.c:1857
#4  0x5656db06 in select_application (ctrl=0x565d1268, 
name=0xf730052d "openpgp", r_app=0x565d1270, scan=1, serialno_bin=0x0, 
    serialno_bin_len=0) at ../../scd/app.c:329
#5  0x5655d392 in open_card_with_request (serialno=<optimized out>, 
apptype=<optimized out>, ctrl=0x565d1268) at ../../scd/command.c:235
#6  cmd_serialno (ctx=0xf7300468, line=<optimized out>)
     at ../../scd/command.c:294
#7  0xf7e9ee96 in ?? () from /usr/lib/i386-linux-gnu/libassuan.so.0
(gdb) up
#1  0xf7e61cb6 in libusb_get_device_list (ctx=0x0,
     list=0x565c7800 <ccid_usb_dev_list>) at ../../libusb/core.c:671
671			usbi_mutex_lock(&ctx->usb_devs_lock);
(gdb) p ctx
$3 = (libusb_context *) 0x0
(gdb) p usbi_default_context
$4 = (struct libusb_context *) 0x0

(when application does not specify context (ctx=NULL), libusb uses 
"default context"; but as initialization failed, it is NULL too).

(this is on debian jessie, i386, libusb-1.0 1.0.19, and various related
libraries from backports [Build-Depends])

With patch below, it just freezes at
=== cut ===
...
PASS: tests/openpgp/decrypt-unwrap-verify.scm
Checking signing with the default hash algorithm
      > plain-1 plain-2 <<< [here]
=== cut ===
Have no idea why.

--- gnupg2-2.1.21/scd/ccid-driver.c.orig	2017-05-15 15:13:22.000000000 +0300
+++ gnupg2-2.1.21/scd/ccid-driver.c	2017-05-30 14:36:35.000000000 +0300
@@ -1228,7 +1228,12 @@
     if (!initialized_usb)
      {
-      libusb_init (NULL);
+      int rc;
+      if ((rc = libusb_init (NULL)) != 0)
+        {
+          fprintf(stderr, "libusb_init failed: %s/%s\n", 
libusb_error_name(rc), libusb_strerror(rc));
+	  return NULL;
+        }
        initialized_usb = 1;
      }
  @@ -1294,7 +1299,14 @@
     if (!initialized_usb)
      {
-      libusb_init (NULL);
+      int rc;
+      if ((rc = libusb_init (NULL)) != 0)
+        {
+          fprintf(stderr, "libusb_init failed: %s/%s\n", 
libusb_error_name(rc), libusb_strerror(rc));
+          *idx_max_p = 0;
+          *t_p = NULL;
+          return gpg_err_make(GPG_ERR_SOURCE_SCD, GPG_ERR_HARDWARE);
+        }
        initialized_usb = 1;
      }

P.S. when I posted this message via news.gmane.org, I got:

 > A message that you sent could not be delivered to one or more of its
 > recipients. This is a permanent error. The following address(es) failed:
 >
 >   gnupg-users at gnupg.org
 >    SMTP error from remote mail server after RCPT TO:<gnupg-> 
users at gnupg.org>:
 >     host kerckhoffs.g10code.com [217.69.77.222]: 550 Reverse DNS 
lookup failed for host 195.159.176.226.



More information about the Gnupg-users mailing list