Skip site navigation (1)Skip section navigation (2)
Date:      Wed, 14 Jun 2017 23:39:39 +0700
From:      Eugene Grosbein <eugen@grosbein.net>
To:        Konstantin Belousov <kostikbel@gmail.com>
Cc:        FreeBSD Stable <freebsd-stable@FreeBSD.org>, Gleb Smirnoff <glebius@FreeBSD.org>
Subject:   Re: syslog() thread unsafety
Message-ID:  <594166CB.60709@grosbein.net>
In-Reply-To: <20170614141238.GM2088@kib.kiev.ua>
References:  <59413EF0.20608@grosbein.net> <20170614141238.GM2088@kib.kiev.ua>

next in thread | previous in thread | raw e-mail | index | archive | help
14.06.2017 21:12, Konstantin Belousov wrote:

> If the issue is that mpd5 cancels logging thread, and this leaves the
> mutex in the locked state, the right solution is to establish a cleanup
> handler around the locked region.  Note that this can only work if the
> cancellation is in deferred mode, async mode is unsafe by definition.
> 
> Try something like this, untested even a minimal bit.

[skip]

I've given it a spin with unpatched mpd5 and it seems to work just fine now.
I'm curious, should these two lines be swapped?

+	THREAD_LOCK();
+	pthread_cleanup_push(syslog_cancel_cleanup, NULL);

It seems it could be a race between another thread's pthread_cancel()
and pthread_cleanup_push() here.

Anyway, we have several other places in the lib/ with similar code
possibly missing pthread_cleanup_push():

lib/libc/gen: popen.c, getlogin.c
lib/libc/stdio: findfp.c, fclose.c

Please consider committing the fix at least for syslog.c





Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?594166CB.60709>