Follow @Openwall on Twitter for new release announcements and other news
[<prev] [next>] [day] [month] [year] [list]
Message-ID: <tencent_9A620609B3300E395885FA8CCCDDD5689A06@qq.com>
Date: Thu, 11 Jul 2024 22:40:22 +0800
From: "AK47" <250200715@...com>
To: "musl" <musl@...ts.openwall.com>
Subject: Re:RE: Maybe A Bug about timer_create and pthread_barrier_wait

Hello:<br/><br/>&amp;gt;pthread_barrier_destroy()&amp;nbsp;waits&amp;nbsp;for&amp;nbsp;all&amp;nbsp;threads&amp;nbsp;to&amp;nbsp;be&amp;nbsp;done&amp;nbsp;using&amp;nbsp;the<br/>&amp;gt;barrier&amp;nbsp;before&amp;nbsp;destroying&amp;nbsp;it.&amp;nbsp;&amp;nbsp;Without&amp;nbsp;it,&amp;nbsp;the&amp;nbsp;storage&amp;nbsp;for&amp;nbsp;the&amp;nbsp;barrier<br/>&amp;gt;can&amp;nbsp;be&amp;nbsp;deallocated&amp;nbsp;when&amp;nbsp;timer_create()&amp;nbsp;returns&amp;nbsp;while&amp;nbsp;the&amp;nbsp;other&amp;nbsp;thread&amp;nbsp;is<br/>&amp;gt;still&amp;nbsp;using&amp;nbsp;it&amp;nbsp;inside&amp;nbsp;the&amp;nbsp;pthread_barrier_wait()&amp;nbsp;implementation.<br/><br/>Sorry,&nbsp;I&nbsp;don&#39;t&nbsp;think&nbsp;add&nbsp;pthread_barrier_destroy&nbsp;in&nbsp;timer_create&nbsp;can&nbsp;solve&nbsp;this&nbsp;bug.&nbsp;In&nbsp;timer_create,&nbsp;b-&amp;gt;_b_limit&nbsp;should&nbsp;be&nbsp;1,&nbsp;and&nbsp;it&nbsp;will&nbsp;never&nbsp;meet&nbsp;the&nbsp;waiting&nbsp;condition&nbsp;(b-&amp;gt;_b_limit&nbsp;&amp;lt;&nbsp;0)&nbsp;in&nbsp;pthread_barrier_destroy.<br/>And&nbsp;I&nbsp;think&nbsp;add&nbsp;additional&nbsp;synchronization&nbsp;to&nbsp;timer_create&nbsp;&nbsp;is&nbsp;a&nbsp;temporary&nbsp;method.&nbsp;Maybe&nbsp;some&nbsp;bugfix&nbsp;is&nbsp;needed&nbsp;in&nbsp;pthread_barrier_wait.<br/><br/>int&nbsp;pthread_barrier_destroy(pthread_barrier_t&nbsp;*b)<br/>{<br/>	if&nbsp;(b-&amp;gt;_b_limit&nbsp;&amp;lt;&nbsp;0)&nbsp;{<br/>		if&nbsp;(b-&amp;gt;_b_lock)&nbsp;{<br/>			int&nbsp;v;<br/>			a_or(&amp;amp;b-&amp;gt;_b_lock,&nbsp;INT_MIN);<br/>			while&nbsp;((v&nbsp;=&nbsp;b-&amp;gt;_b_lock)&nbsp;&amp;amp;&nbsp;INT_MAX)<br/>				__wait(&amp;amp;b-&amp;gt;_b_lock,&nbsp;0,&nbsp;v,&nbsp;0);<br/>		}<br/>		__vm_wait();<br/>	}<br/>	return&nbsp;0;<br/>}<br/><br/>Li<br/><br/><br/>&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;<br/>Original&amp;nbsp;Email<br/><br/>&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;<br/><br/>&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;<br/>From:&quot;Tavian&amp;nbsp;Barnes&quot;&amp;lt;&amp;nbsp;tavianator@...ianator.com&amp;nbsp;&amp;gt;;<br/>Sent&amp;nbsp;Time:2024/7/11&amp;nbsp;3:11<br/>To:&quot;musl&quot;&amp;lt;&amp;nbsp;musl@...ts.openwall.com&amp;nbsp;&amp;gt;;<br/>Cc&amp;nbsp;recipient:&quot;250200715&quot;&amp;lt;&amp;nbsp;250200715@...com&amp;nbsp;&amp;gt;;<br/>Subject:[musl]&amp;nbsp;RE:&amp;nbsp;Maybe&amp;nbsp;A&amp;nbsp;Bug&amp;nbsp;about&amp;nbsp;timer_create&amp;nbsp;and&amp;nbsp;pthread_barrier_wait<br/><br/>(I&amp;nbsp;cleaned&amp;nbsp;up&amp;nbsp;the&amp;nbsp;HTML&amp;nbsp;entities&amp;nbsp;in&amp;nbsp;this&amp;nbsp;email,&amp;nbsp;but&amp;nbsp;please&amp;nbsp;use&amp;nbsp;plain&amp;nbsp;text<br/>mode&amp;nbsp;next&amp;nbsp;time)<br/><br/>&amp;gt;&amp;nbsp;Hello:<br/>&amp;gt;<br/>&amp;gt;&amp;nbsp;I&amp;nbsp;had&amp;nbsp;a&amp;nbsp;low-probability&amp;nbsp;crash&amp;nbsp;in&amp;nbsp;the&amp;nbsp;child&amp;nbsp;thread&amp;nbsp;when&amp;nbsp;using&amp;nbsp;the<br/>&amp;gt;&amp;nbsp;timer_create&amp;nbsp;interface.&amp;nbsp;After&amp;nbsp;debug,&amp;nbsp;I&amp;nbsp;found&amp;nbsp;that&amp;nbsp;the&amp;nbsp;crash&amp;nbsp;occured<br/>&amp;gt;&amp;nbsp;when&amp;nbsp;the&amp;nbsp;sub-thread&amp;nbsp;accessed&amp;nbsp;in&amp;nbsp;code&amp;nbsp;&quot;if&amp;nbsp;(b-&amp;gt;_b_waiters)&quot;&amp;nbsp;which&amp;nbsp;is&amp;nbsp;a<br/>&amp;gt;&amp;nbsp;stack&amp;nbsp;variable&amp;nbsp;created&amp;nbsp;in&amp;nbsp;the&amp;nbsp;main&amp;nbsp;thread&amp;nbsp;and&amp;nbsp;passed&amp;nbsp;to&amp;nbsp;child&amp;nbsp;thread<br/>&amp;gt;&amp;nbsp;by&amp;nbsp;args.&amp;nbsp;It&amp;nbsp;looks&amp;nbsp;like&amp;nbsp;the&amp;nbsp;main&amp;nbsp;thread&#39;s&amp;nbsp;timer_create&amp;nbsp;has&amp;nbsp;finished<br/>&amp;gt;&amp;nbsp;executing&amp;nbsp;at&amp;nbsp;this&amp;nbsp;point,&amp;nbsp;so&amp;nbsp;the&amp;nbsp;variables&amp;nbsp;(start_args)&amp;nbsp;on&amp;nbsp;the&amp;nbsp;stack<br/>&amp;gt;&amp;nbsp;have&amp;nbsp;been&amp;nbsp;cleaned&amp;nbsp;up.&amp;nbsp;I&amp;nbsp;take&amp;nbsp;a&amp;nbsp;look&amp;nbsp;at&amp;nbsp;the&amp;nbsp;pthread_barrier_wait&amp;nbsp;code<br/>&amp;gt;&amp;nbsp;and&amp;nbsp;I&amp;nbsp;think&amp;nbsp;it&amp;nbsp;should&amp;nbsp;be&amp;nbsp;a&amp;nbsp;scheduling&amp;nbsp;problem&amp;nbsp;in&amp;nbsp;pthread_barrier_wait.<br/>&amp;gt;<br/>&amp;gt;&amp;nbsp;Take&amp;nbsp;the&amp;nbsp;timer_create&amp;nbsp;as&amp;nbsp;an&amp;nbsp;example,&amp;nbsp;when&amp;nbsp;the&amp;nbsp;child&amp;nbsp;thread&amp;nbsp;is&amp;nbsp;the<br/>&amp;gt;&amp;nbsp;first&amp;nbsp;thread&amp;nbsp;for&amp;nbsp;&quot;pthread_barrier_wait&quot;&amp;nbsp;and&amp;nbsp;it&amp;nbsp;is&amp;nbsp;suspened&amp;nbsp;after&amp;nbsp;it<br/>&amp;gt;&amp;nbsp;executes&amp;nbsp;the&amp;nbsp;code&amp;nbsp;&quot;a_store(&amp;amp;b-&amp;gt;_b_lock,&amp;nbsp;0)&quot;,&amp;nbsp;then&amp;nbsp;the&amp;nbsp;main&amp;nbsp;thread&amp;nbsp;in<br/>&amp;gt;&amp;nbsp;timer_create&amp;nbsp;will&amp;nbsp;arrive&amp;nbsp;as&amp;nbsp;the&amp;nbsp;last&amp;nbsp;thread,&amp;nbsp;it&amp;nbsp;will&amp;nbsp;nerver&amp;nbsp;wait&amp;nbsp;for<br/>&amp;gt;&amp;nbsp;the&amp;nbsp;child&amp;nbsp;thread&amp;nbsp;to&amp;nbsp;be&amp;nbsp;rescheduled,&amp;nbsp;the&amp;nbsp;main&amp;nbsp;thread&amp;nbsp;can&amp;nbsp;pass&amp;nbsp;the<br/>&amp;gt;&amp;nbsp;barrier&amp;nbsp;and&amp;nbsp;continue&amp;nbsp;execution,&amp;nbsp;the&amp;nbsp;args&amp;nbsp;created&amp;nbsp;in&amp;nbsp;timer_create&amp;nbsp;will<br/>&amp;gt;&amp;nbsp;be&amp;nbsp;cleaned&amp;nbsp;up.&amp;nbsp;when&amp;nbsp;the&amp;nbsp;child&amp;nbsp;thread&amp;nbsp;is&amp;nbsp;finally&amp;nbsp;rescheduled,&amp;nbsp;it&amp;nbsp;access<br/>&amp;gt;&amp;nbsp;the&amp;nbsp;&quot;b-&amp;gt;_b_waiters&quot;&amp;nbsp;which&amp;nbsp;has&amp;nbsp;already&amp;nbsp;been&amp;nbsp;cleaned&amp;nbsp;up&amp;nbsp;by&amp;nbsp;main&amp;nbsp;thread<br/>&amp;gt;&amp;nbsp;and&amp;nbsp;the&amp;nbsp;crash&amp;nbsp;will&amp;nbsp;occur.<br/>&amp;gt;<br/>&amp;gt;&amp;nbsp;Is&amp;nbsp;there&amp;nbsp;a&amp;nbsp;bug&amp;nbsp;here?&amp;nbsp;Looking&amp;nbsp;forward&amp;nbsp;to&amp;nbsp;your&amp;nbsp;reply.<br/>&amp;gt;<br/>&amp;gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;/*&amp;nbsp;First&amp;nbsp;thread&amp;nbsp;to&amp;nbsp;enter&amp;nbsp;the&amp;nbsp;barrier&amp;nbsp;becomes&amp;nbsp;the&amp;nbsp;&quot;instance&amp;nbsp;owner&quot;&amp;nbsp;*/<br/>&amp;gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;(!inst)&amp;nbsp;{<br/>&amp;gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;struct&amp;nbsp;instance&amp;nbsp;new_inst&amp;nbsp;=&amp;nbsp;{&amp;nbsp;0&amp;nbsp;};<br/>&amp;gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;int&amp;nbsp;spins&amp;nbsp;=&amp;nbsp;200;<br/>&amp;gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;b-&amp;gt;_b_inst&amp;nbsp;=&amp;nbsp;inst&amp;nbsp;=&amp;nbsp;&amp;amp;new_inst;<br/>&amp;gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;a_store(&amp;amp;b-&amp;gt;_b_lock,&amp;nbsp;0);<br/>&amp;gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;(b-&amp;gt;_b_waiters)&amp;nbsp;__wake(&amp;amp;b-&amp;gt;_b_lock,&amp;nbsp;1,&amp;nbsp;1);&amp;nbsp;&amp;nbsp;//&amp;nbsp;crash&amp;nbsp;here&amp;nbsp;b-&amp;gt;_b_waiters<br/>&amp;gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;while&amp;nbsp;(spins--&amp;nbsp;&amp;amp;&amp;amp;&amp;nbsp;!inst-&amp;gt;finished)<br/>&amp;gt;<br/>&amp;gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;/*&amp;nbsp;First&amp;nbsp;thread&amp;nbsp;to&amp;nbsp;enter&amp;nbsp;the&amp;nbsp;barrier&amp;nbsp;becomes&amp;nbsp;the&amp;nbsp;&quot;instance&amp;nbsp;owner&quot;&amp;nbsp;*/<br/>&amp;gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;(!inst)&amp;nbsp;{<br/>&amp;gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;struct&amp;nbsp;instance&amp;nbsp;new_inst&amp;nbsp;=&amp;nbsp;{&amp;nbsp;0&amp;nbsp;};<br/>&amp;gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;int&amp;nbsp;spins&amp;nbsp;=&amp;nbsp;200;<br/>&amp;gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;b-&amp;gt;_b_inst&amp;nbsp;=&amp;nbsp;inst&amp;nbsp;=&amp;nbsp;&amp;amp;new_inst;<br/>&amp;gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;a_store(&amp;amp;b-&amp;gt;_b_lock,&amp;nbsp;0);<br/>&amp;gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//&amp;nbsp;when&amp;nbsp;the&amp;nbsp;child&amp;nbsp;thread&amp;nbsp;is&amp;nbsp;the&amp;nbsp;first&amp;nbsp;thread&amp;nbsp;and&amp;nbsp;is&amp;nbsp;scheduled&amp;nbsp;out&amp;nbsp;here<br/>&amp;gt;<br/>&amp;gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;(b-&amp;gt;_b_waiters)&amp;nbsp;__wake(&amp;amp;b-&amp;gt;_b_lock,&amp;nbsp;1,&amp;nbsp;1);<br/>&amp;gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;while&amp;nbsp;(spins--&amp;nbsp;&amp;amp;&amp;amp;&amp;nbsp;!inst-&amp;gt;finished)<br/><br/>This&amp;nbsp;looks&amp;nbsp;like&amp;nbsp;a&amp;nbsp;real&amp;nbsp;bug&amp;nbsp;in&amp;nbsp;timer_create()&amp;nbsp;to&amp;nbsp;me.&amp;nbsp;&amp;nbsp;Here&#39;s&amp;nbsp;an&amp;nbsp;untested<br/>fix:<br/><br/>From:&amp;nbsp;Tavian&amp;nbsp;Barnes&amp;nbsp;<br/>Date:&amp;nbsp;Wed,&amp;nbsp;10&amp;nbsp;Jul&amp;nbsp;2024&amp;nbsp;14:27:21&amp;nbsp;-0400<br/>Subject:&amp;nbsp;[PATCH]&amp;nbsp;timer_create:&amp;nbsp;destroy&amp;nbsp;the&amp;nbsp;barrier&amp;nbsp;before&amp;nbsp;returning<br/><br/>pthread_barrier_destroy()&amp;nbsp;waits&amp;nbsp;for&amp;nbsp;all&amp;nbsp;threads&amp;nbsp;to&amp;nbsp;be&amp;nbsp;done&amp;nbsp;using&amp;nbsp;the<br/>barrier&amp;nbsp;before&amp;nbsp;destroying&amp;nbsp;it.&amp;nbsp;&amp;nbsp;Without&amp;nbsp;it,&amp;nbsp;the&amp;nbsp;storage&amp;nbsp;for&amp;nbsp;the&amp;nbsp;barrier<br/>can&amp;nbsp;be&amp;nbsp;deallocated&amp;nbsp;when&amp;nbsp;timer_create()&amp;nbsp;returns&amp;nbsp;while&amp;nbsp;the&amp;nbsp;other&amp;nbsp;thread&amp;nbsp;is<br/>still&amp;nbsp;using&amp;nbsp;it&amp;nbsp;inside&amp;nbsp;the&amp;nbsp;pthread_barrier_wait()&amp;nbsp;implementation.<br/><br/>Link:&amp;nbsp;https://www.openwall.com/lists/musl/2024/07/08/1<br/>---<br/>&amp;nbsp;src/time/timer_create.c&amp;nbsp;|&amp;nbsp;1&amp;nbsp;+<br/>&amp;nbsp;1&amp;nbsp;file&amp;nbsp;changed,&amp;nbsp;1&amp;nbsp;insertion(+)<br/><br/>diff&amp;nbsp;--git&amp;nbsp;a/src/time/timer_create.c&amp;nbsp;b/src/time/timer_create.c<br/>index&amp;nbsp;9216b3ab..42c69848&amp;nbsp;100644<br/>---&amp;nbsp;a/src/time/timer_create.c<br/>+++&amp;nbsp;b/src/time/timer_create.c<br/>@@&amp;nbsp;-121,6&amp;nbsp;+121,7&amp;nbsp;@@&amp;nbsp;int&amp;nbsp;timer_create(clockid_t&amp;nbsp;clk,&amp;nbsp;struct&amp;nbsp;sigevent&amp;nbsp;*restrict&amp;nbsp;evp,&amp;nbsp;timer_t&amp;nbsp;*restrict<br/>&amp;nbsp;&amp;nbsp;&amp;nbsp;}<br/>&amp;nbsp;&amp;nbsp;&amp;nbsp;td-&amp;gt;timer_id&amp;nbsp;=&amp;nbsp;timerid;<br/>&amp;nbsp;&amp;nbsp;&amp;nbsp;pthread_barrier_wait(&amp;amp;args.b);<br/>+&amp;nbsp;&amp;nbsp;pthread_barrier_destroy(&amp;amp;args.b);<br/>&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;(timerid&amp;nbsp;&amp;lt;&amp;nbsp;0)&amp;nbsp;return&amp;nbsp;-1;<br/>&amp;nbsp;&amp;nbsp;&amp;nbsp;*res&amp;nbsp;=&amp;nbsp;(void&amp;nbsp;*)(INTPTR_MIN&amp;nbsp;|&amp;nbsp;(uintptr_t)td&amp;gt;&amp;gt;1);<br/>&amp;nbsp;&amp;nbsp;&amp;nbsp;break;

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.