Follow @Openwall on Twitter for new release announcements and other news
[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Date: Thu, 23 Jul 2015 05:07:21 +0200
From: Szabolcs Nagy <nsz@...t70.net>
To: musl@...ts.openwall.com
Subject: Re: [PATCH] fix atexit when it is called from an atexit
 handler

* Rich Felker <dalias@...c.org> [2015-07-22 21:18:16 -0400]:
> On Thu, Jul 23, 2015 at 01:44:06AM +0200, Szabolcs Nagy wrote:
> >  void __funcs_on_exit()
> >  {
> >  	int i;
> >  	void (*func)(void *), *arg;
> >  	LOCK(lock);
> > -	for (; head; head=head->next) for (i=COUNT-1; i>=0; i--) {
> > -		if (!head->f[i]) continue;
> > +	for (;;) {
> > +		i = next();
> > +		if (i<0) break;
> >  		func = head->f[i];
> >  		arg = head->a[i];
> >  		head->f[i] = 0;
> 
> I agree that this change should be made, but I don't like the
> particulars of the patch. It seems to increase exit handler runtime to
> O(n²) even in the case where no atexit is happening during exit, and
> it's not very elegant. I think a simpler solution would be to reset i
> to COUNT after calling f[i] if either (1) head has changed, or (2)
> i<COUNT-1 and f[i+1] is nonzero. Does this sound correct/better?

(2) should be 'f[i] is nonzero'.

i didnt think about detecting the change of head,
but it is simpler and better for the common case.

View attachment "0001-fix-atexit-when-it-is-called-from-an-atexit-handler.patch" of type "text/x-diff" (1454 bytes)

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.