|
Message-ID: <20150723011816.GT1173@brightrain.aerifal.cx> Date: Wed, 22 Jul 2015 21:18:16 -0400 From: Rich Felker <dalias@...c.org> To: musl@...ts.openwall.com Subject: Re: [PATCH] fix atexit when it is called from an atexit handler On Thu, Jul 23, 2015 at 01:44:06AM +0200, Szabolcs Nagy wrote: > When running atexit handlers always restart iterating the list of > handlers so if new ones are registered they are called in the right > order. > > Note that the iteration changes the head pointer in an irreversible > way, this is not a problem, but may cause more allocations than > optimal when new handlers are registered during exit. > > The old code accepted atexit handlers after exit, but did not run > them. C11 seems to explicitly allow atexit to fail in this case, > but this situation can easily come up in C++ if a destructor has > local static object with a destructor so it should be handled. > --- > src/exit/atexit.c | 15 +++++++++++++-- > 1 file changed, 13 insertions(+), 2 deletions(-) > > diff --git a/src/exit/atexit.c b/src/exit/atexit.c > index be82718..a0fd8d7 100644 > --- a/src/exit/atexit.c > +++ b/src/exit/atexit.c > @@ -14,13 +14,24 @@ static struct fl > > static volatile int lock[2]; > > +static int next() > +{ > + int i; > + for (; head; head=head->next) > + for (i=COUNT-1; i>=0; i--) > + if (head->f[i]) > + return i; > + return -1; > +} > + > 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? Rich
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.