bugWeeChat - Bugs: bug #41576, weechat hangs/crashes if...

 
 

bug #41576: weechat hangs/crashes if libpthread.so.0 is loaded after startup and GnuTLS is used

Submitted by:  Johannes Nixdorf <mixi>
Submitted on:  Thu 13 Feb 2014 10:56:47 AM UTC  
 
Category: compilationSeverity: 3 - Normal
Item Group: crashStatus: Fixed
Privacy: PublicAssigned to: Sebastien Helleu <flashcode>
Originator Name: Open/Closed: Open
Release: 0.4.3IRC nick: mixi

Add a New Comment (Rich MarkupRich Markup):
   

You are not logged in

Please log in, so followups can be emailed to you.

 

Thu 13 Feb 2014 03:49:35 PM UTC, comment #3:

I can confirm this fix works fine here.

Johannes Nixdorf <mixi>
Thu 13 Feb 2014 03:11:11 PM UTC, comment #2:

Committed (c324610226cef15ecfb1235113c8243b068084c8).

Johannes, could you please confirm if this fix is working fine for you? Thank you.

Sebastien Helleu <flashcode>
Project AdministratorIn charge of this item.
Thu 13 Feb 2014 02:11:45 PM UTC, comment #1:

Yes, I can concur that this is indeed what's happening, and that the patch I've posted fixes the issue.

FlashCode asked for more explanation, so here goes:

The CMakeLists.txt has a section in it that only adds “-lpthread” on OpenBSD platforms. For all other platforms, libpthread is not linked.

However, gnutls uses libpthread. The glibc developers were clever and set things up such that if you don't explicitly link against libpthread, and library code still uses the functions from it, you'll instead wind up using functions that all return 0. This is so that single-threaded programs aren't burdened with the overhead of mutexes and such, when they aren't needed.

So when weechat was loaded, it would also load gnutls. Gnutls would then make several calls to pthread_mutex_init. Since libpthread wasn't loaded, this function would be hitting the code inside libc, which would simply return 0. So the mutex would never be initialized and instead it would contain uninitialized junk from malloc(). This was fine, since all the other pthread functions that libc implements do the same – return 0 – so nothing bad happens since that data is never touched.

However, later in the weechat initialization, the python plugin is loaded. This plugin directly or indirectly links in the proper libpthread. This means that after this point, all function calls to pthread_mutex_lock and pthread_mutex_unlock are hitting the real pthread code, that actually works with the data and does a lot more than simply return 0. But because these mutexes were not initialized before with the zero-returning pthread_mutex_init, the lock and unlock functions are dealing with uninitialized random malloc() data. And so, in lots of cases, we crash, or abort().

My patch simply removes the “if OpenBSD” guard and links against libpthread always.

Jason A. Donenfeld <zx2c4>
Thu 13 Feb 2014 10:56:47 AM UTC, original submission:

GnuTLS sets up mutexes with pthread_mutex_init before libpthread.so.0 is loaded. This works because glibc provides stubbed pthread functions, which are used when libpthread.so.0 is not loaded. Because some weechat plugins link to libpthread.so.0, it is loaded after the mutex is thought to be initialized with pthread_mutex_init (which is actually a stub, because the libpthread.so.0 wasn't loaded) and later calls to e.g. pthread_mutex_lock/pthread_mutex_unlock use code from libpthread.so.0, which assumes the mutex was properly initialized. This causes weechat to crash in some cases and hang in pthread_mutex_lock in other cases (as shown in the attached file).

This is not a problem when compiling weechat with autotools, because it links the weechat binary with libpthread.so.0. With cmake this only happens on openbsd.

Johannes Nixdorf <mixi>

 

(Note: upload size limit is set to 16384 kB, after insertion of the required escape characters.)

Attach File(s):
   
   
Comment:
   

Attached Files
file #30534:  0001-Link-against-pthread-on-all-platforms.patch added by None (913B - text/x-patch - This fixes the problem.)
file #30533:  weechat_bt_hang.txt added by mixi (3kB - text/plain)

 

Depends on the following items: None found

Items that depend on this one: None found

 

Carbon-Copy List
  • -unavailable- added by flashcode (Posted a comment)
  • -unavailable- added by zx2c4 (Posted a comment)
  • -unavailable- added by mixi (Submitted the item)
  •  

    Do you think this task is very important?
    If so, you can click here to add your encouragement to it.
    This task has 0 encouragements so far.

    Only logged-in users can vote.

     

    Please enter the title of George Orwell's famous dystopian book (it's a date):

     

     

    Follow 6 latest changes.

    Date Changed By Updated Field Previous Value => Replaced By
    Thu 13 Feb 2014 03:11:11 PM UTCflashcodeCategoryother=>compilation
      Item Groupother=>crash
      StatusNone=>Fixed
      Assigned toNone=>flashcode
    Thu 13 Feb 2014 01:36:53 PM UTCNoneAttached File-=>Added 0001-Link-against-pthread-on-all-platforms.patch, #30534
    Thu 13 Feb 2014 10:56:47 AM UTCmixiAttached File-=>Added weechat_bt_hang.txt, #30533

    Back to the top


    Powered by Savane 3.1-cleanup