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>