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

Sorry, there is some bug in my QQ email. I will retry to send an email


                       
Original Email
                       
                     

From:"AK47"< 250200715@...com &gt;;

Sent Time:2024/7/11 22:40

To:"musl"< musl@...ts.openwall.com &gt;;

Subject:Re:[musl] RE: Maybe A Bug about timer_create and pthread_barrier_wait


Hello:

&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
&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
&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
&amp;gt;still&amp;nbsp;using&amp;nbsp;it&amp;nbsp;inside&amp;nbsp;the&amp;nbsp;pthread_barrier_wait()&amp;nbsp;implementation.

Sorry,&nbsp;I&nbsp;don'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.
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.

int&nbsp;pthread_barrier_destroy(pthread_barrier_t&nbsp;*b)
{
	if&nbsp;(b-&amp;gt;_b_limit&nbsp;&amp;lt;&nbsp;0)&nbsp;{
		if&nbsp;(b-&amp;gt;_b_lock)&nbsp;{
			int&nbsp;v;
			a_or(&amp;amp;b-&amp;gt;_b_lock,&nbsp;INT_MIN);
			while&nbsp;((v&nbsp;=&nbsp;b-&amp;gt;_b_lock)&nbsp;&amp;amp;&nbsp;INT_MAX)
				__wait(&amp;amp;b-&amp;gt;_b_lock,&nbsp;0,&nbsp;v,&nbsp;0);
		}
		__vm_wait();
	}
	return&nbsp;0;
}

Li


&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;
Original&amp;nbsp;Email

&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;

&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;
From:"Tavian&amp;nbsp;Barnes"&amp;lt;&amp;nbsp;tavianator@...ianator.com&amp;nbsp;&amp;gt;;
Sent&amp;nbsp;Time:2024/7/11&amp;nbsp;3:11
To:"musl"&amp;lt;&amp;nbsp;musl@...ts.openwall.com&amp;nbsp;&amp;gt;;
Cc&amp;nbsp;recipient:"250200715"&amp;lt;&amp;nbsp;250200715@...com&amp;nbsp;&amp;gt;;
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

(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
mode&amp;nbsp;next&amp;nbsp;time)

&amp;gt;&amp;nbsp;Hello:
&amp;gt;
&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
&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
&amp;gt;&amp;nbsp;when&amp;nbsp;the&amp;nbsp;sub-thread&amp;nbsp;accessed&amp;nbsp;in&amp;nbsp;code&amp;nbsp;"if&amp;nbsp;(b-&amp;gt;_b_waiters)"&amp;nbsp;which&amp;nbsp;is&amp;nbsp;a
&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
&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's&amp;nbsp;timer_create&amp;nbsp;has&amp;nbsp;finished
&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
&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
&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.
&amp;gt;
&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
&amp;gt;&amp;nbsp;first&amp;nbsp;thread&amp;nbsp;for&amp;nbsp;"pthread_barrier_wait"&amp;nbsp;and&amp;nbsp;it&amp;nbsp;is&amp;nbsp;suspened&amp;nbsp;after&amp;nbsp;it
&amp;gt;&amp;nbsp;executes&amp;nbsp;the&amp;nbsp;code&amp;nbsp;"a_store(&amp;amp;b-&amp;gt;_b_lock,&amp;nbsp;0)",&amp;nbsp;then&amp;nbsp;the&amp;nbsp;main&amp;nbsp;thread&amp;nbsp;in
&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
&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
&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
&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
&amp;gt;&amp;nbsp;the&amp;nbsp;"b-&amp;gt;_b_waiters"&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
&amp;gt;&amp;nbsp;and&amp;nbsp;the&amp;nbsp;crash&amp;nbsp;will&amp;nbsp;occur.
&amp;gt;
&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.
&amp;gt;
&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;"instance&amp;nbsp;owner"&amp;nbsp;*/
&amp;gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;(!inst)&amp;nbsp;{
&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;};
&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;
&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;
&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);
&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
&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)
&amp;gt;
&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;"instance&amp;nbsp;owner"&amp;nbsp;*/
&amp;gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;(!inst)&amp;nbsp;{
&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;};
&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;
&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;
&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);
&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
&amp;gt;
&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;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)

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's&amp;nbsp;an&amp;nbsp;untested
fix:

From:&amp;nbsp;Tavian&amp;nbsp;Barnes&amp;nbsp;
Date:&amp;nbsp;Wed,&amp;nbsp;10&amp;nbsp;Jul&amp;nbsp;2024&amp;nbsp;14:27:21&amp;nbsp;-0400
Subject:&amp;nbsp;[PATCH]&amp;nbsp;timer_create:&amp;nbsp;destroy&amp;nbsp;the&amp;nbsp;barrier&amp;nbsp;before&amp;nbsp;returning

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
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
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
still&amp;nbsp;using&amp;nbsp;it&amp;nbsp;inside&amp;nbsp;the&amp;nbsp;pthread_barrier_wait()&amp;nbsp;implementation.

Link:&amp;nbsp;https://www.openwall.com/lists/musl/2024/07/08/1
---
&amp;nbsp;src/time/timer_create.c&amp;nbsp;|&amp;nbsp;1&amp;nbsp;+
&amp;nbsp;1&amp;nbsp;file&amp;nbsp;changed,&amp;nbsp;1&amp;nbsp;insertion(+)

diff&amp;nbsp;--git&amp;nbsp;a/src/time/timer_create.c&amp;nbsp;b/src/time/timer_create.c
index&amp;nbsp;9216b3ab..42c69848&amp;nbsp;100644
---&amp;nbsp;a/src/time/timer_create.c
+++&amp;nbsp;b/src/time/timer_create.c
@@&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
&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&amp;nbsp;&amp;nbsp;&amp;nbsp;td-&amp;gt;timer_id&amp;nbsp;=&amp;nbsp;timerid;
&amp;nbsp;&amp;nbsp;&amp;nbsp;pthread_barrier_wait(&amp;amp;args.b);
+&amp;nbsp;&amp;nbsp;pthread_barrier_destroy(&amp;amp;args.b);
&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;(timerid&amp;nbsp;&amp;lt;&amp;nbsp;0)&amp;nbsp;return&amp;nbsp;-1;
&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);
&amp;nbsp;&amp;nbsp;&amp;nbsp;break;
Content of type "text/html" skipped

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.