... And I truely don't get it.

The SIGSEGV happens from time to time when I replace the driver I'm developping with a new version of it. I use sudo pcscd -f -d -a as a command line to launch the daemon. Here is the backtrace I get from gdb (including a few debug lines that comes right before) :

------------------------>8----------------------------------------

00000033 hotplug_libhal.c:342:HPAddDevice() Adding USB device: usb_device_aaa_bbbb_01234567890123_if0 01001148 readerfactory.c:1024:RFInitializeReader() Attempting startup of XXXYYYY (01234567890123) 00 00 using /usr/local/pcsc/drivers/xxxyyyy.bundle/Contents/Linux/libifd_xxxyyyy.so

Program received signal SIGSEGV, Segmentation fault.
[Switching to Thread 0xb7c1ab90 (LWP 11390)]
0xb7fbfc21 in ?? () from /lib/ld-linux.so.2
(gdb) bt
#0  0xb7fbfc21 in ?? () from /lib/ld-linux.so.2
#1  0xb7fc00ad in ?? () from /lib/ld-linux.so.2
#2  0xb7fc02bf in ?? () from /lib/ld-linux.so.2
#3  0xb7ef7d04 in ?? () from /lib/tls/i686/cmov/libc.so.6
#4  0xb7ef80fa in _dl_sym () from /lib/tls/i686/cmov/libc.so.6
#5  0xb7f9edb8 in ?? () from /lib/tls/i686/cmov/libdl.so.2
#6  0xb7fc5036 in ?? () from /lib/ld-linux.so.2
#7  0xb7f9f01c in ?? () from /lib/tls/i686/cmov/libdl.so.2
#8  0xb7f9ed43 in dlsym () from /lib/tls/i686/cmov/libdl.so.2
#9 0x0804c75a in DYN_GetAddress (pvLHandle=0x9e3d918, pvFHandle=0x0, pcFunction=0xb7fd3cc0 "") at dyn_unix.c:72 #10 0x08050a92 in RFBindFunctions (rContext=0x9e31008) at readerfactory.c:763 #11 0x08051588 in RFInitializeReader (rContext=0x9e31008) at readerfactory.c:1035 #12 0x080520fe in RFAddReader (lpcReader=0x9e34370 "XXXYYYY (01234567890123)", dwPort=2097152, lpcLibrary=0x9e34c30 "/usr/local/pcsc/drivers/xxxyyyy.bundle/Contents/Linux/libifd_xxxyyyy.so", lpcDevice=0xb7c1a045 "usb:0aaa/bbbb:libhal:/org/freedesktop/Hal/devices/usb_device_aaa_bbbb_01234567890123_if0") at readerfactory.c:229 #13 0x0804d91a in HPAddDevice (ctx=0x9e3e140, udi=0x9e3fa9c "/org/freedesktop/Hal/devices/usb_device_aaa_bbb_01234567890123_if0") at hotplug_libhal.c:393
#14 0xb7f98749 in ?? () from /usr/lib/libhal.so.1
#15 0xb7f610d5 in dbus_connection_dispatch () from /lib/libdbus-1.so.3
#16 0xb7f61527 in ?? () from /lib/libdbus-1.so.3
#17 0x0804d486 in HPEstablishUSBNotifications () at hotplug_libhal.c:236
#18 0xb7f404ff in start_thread () from /lib/tls/i686/cmov/libpthread.so.0
#19 0xb7ebb49e in clone () from /lib/tls/i686/cmov/libc.so.6
(gdb)


---------------------8<---------------------------------------------

I changed a few string (like vid/pid, product name) that don't have much interest. The real issue can be seen on lines #9 abd #10 of this backtrace. I use v1.5.3 of libpcsclite, and here is the code of readerfactory.c at line 749--765 ; line 763 begins with "rv2 = ":

LONG RFBindFunctions(PREADER_CONTEXT rContext)
{
   int rv1, rv2, rv3;
   void *f;

   /*
    * Use this function as a dummy to determine the IFD Handler version
    * type  1.0/2.0/3.0.  Suppress error messaging since it can't be 1.0,
    * 2.0 and 3.0.
    */

   DebugLogSuppress(DEBUGLOG_IGNORE_ENTRIES);

   rv1 = DYN_GetAddress(rContext->vHandle, &f, "IO_Create_Channel");
   rv2 = DYN_GetAddress(rContext->vHandle, &f, "IFDHCreateChannel");
   rv3 = DYN_GetAddress(rContext->vHandle, &f, "IFDHCreateChannelByName");

   DebugLogSuppress(DEBUGLOG_LOG_ENTRIES);

Clearly, there is no way to have DYN_GetAddress() called with pvFHandle set to NULL and pcFunction set to an empty string. After that, getting a segfault in dlsym() because we feed it with an empty function name can be understood (I'm stretching my mind here ; in an ideal world, this should never SIGSEGV).

I suppose that the problem happens before, when the dynamic library is loaded. It seems that something is corrupted somewhere, but this is difficult to see and even more difficult to prove. This can be a problem with the dynamic loader on my machine (uname --all: Linux 53JBD2J 2.6.27-11-generic #1 SMP Wed Apr 1 20:57:48 UTC 2009 i686 GNU/Linux ; that's an Ubuntu 9.04) although I suspect this can happen on other machines as well.

Unfortunately, I don't have much time to investigate this problem, so I can't come with a solution. Although it's a bit annoying, it's not that blocking for me, as a restart of the daemon fixes everything. I repeat, the problem occurs only when I replace my dynamic library with a new version of itself (and sometimes it doesn't SIGSEGV).

If you need more information, please tell me. I'm following the mailing list quite closely these days.

Best regards,

-- Emmanuel Deloget
_______________________________________________
Muscle mailing list
[email protected]
http://lists.drizzle.com/mailman/listinfo/muscle

Reply via email to