Follow @Openwall on Twitter for new release announcements and other news
[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <20201120055828.GL534@brightrain.aerifal.cx>
Date: Fri, 20 Nov 2020 00:58:34 -0500
From: Rich Felker <dalias@...c.org>
To: a@...r0n.science
Cc: musl@...ts.openwall.com
Subject: Re: Mutexes are not unlocking

On Fri, Nov 20, 2020 at 08:25:17AM +0300, a@...r0n.science wrote:
> Hello, all,
> I am experiencing a problem with mutexes in musl-libc. The mutex is
> not unlocked after calling unlock(), this causes getting stuck on
> attempt to lock it next time. Example code (C++):
> 
> void testMutex(std::mutex &mtx, const char * name) {
> fprintf(stderr, "-- testing %s --\n", name);
> fprintf(stderr, "lock\n");
> mtx.lock();
> fprintf(stderr, "unlock\n");
> mtx.unlock();
> fprintf(stderr, "lock2\n");
> mtx.lock();
> fprintf(stderr, "unlock2\n");
> mtx.unlock();
> fprintf(stderr, "done\n");
> }
> The problem can be reproduced only on musl-libc, the same binary
> works well on the system with glibc.

The same binary? Do you mean you have a glibc-built binary you're
trying to use with musl? Or did you mean to say the same source
program?

> The problem does not reproduce each time, its reproducibility
> depends on the phase of moon.
> The problem can be reproduced more often it the code calling mutex
> functions is located in the shared library.
> 
> Strace (when the problem is reproduced):
> [pid   709] writev(2, [{iov_base="-- testing gsMutex --\n", iov_len=22}, {iov_base=NULL, iov_len=0}], 2-- testing gsMutex -- 
> ) = 22 
> [pid   709] writev(2, [{iov_base="", iov_len=0}, {iov_base="lock\n", iov_len=5}], 2lock 
> ) = 5 
> [pid   709] writev(2, [{iov_base="", iov_len=0}, {iov_base="unlock\n", iov_len=7}], 2unlock 
> ) = 7 
> [pid   709] writev(2, [{iov_base="", iov_len=0}, {iov_base="lock2\n", iov_len=6}], 2lock2 
> ) = 6 
> [pid   709] futex(0x7f3a9733e4a4, FUTEX_WAIT_PRIVATE, 2147483664, NULL
> 
> Strace (when the problem is not reproduced):
> writev(2, [{iov_base="-- testing hhMutex --\n", iov_len=22}, {iov_base=NULL, iov_len=0}], 2-- testing hhMutex -- 
> ) = 22 
> writev(2, [{iov_base="", iov_len=0}, {iov_base="lock\n", iov_len=5}], 2lock 
> ) = 5 
> writev(2, [{iov_base="", iov_len=0}, {iov_base="unlock\n", iov_len=7}], 2unlock 
> ) = 7 
> writev(2, [{iov_base="", iov_len=0}, {iov_base="lock2\n", iov_len=6}], 2lock2 
> ) = 6 
> writev(2, [{iov_base="", iov_len=0}, {iov_base="unlock2\n", iov_len=8}], 2unlock2 
> ) = 8 
> writev(2, [{iov_base="", iov_len=0}, {iov_base="done\n", iov_len=5}], 2done 
> ) = 5
> 
> Thanks in advance for solving the problem.

Can you post the full test case and information on how you built it,
including what compiler you're using (whether it's from a distro, or
one you built yourself, or what)?

Rich

Powered by blists - more mailing lists

Confused about mailing lists and their use? Read about mailing lists on Wikipedia and check out these guidelines on proper formatting of your messages.