[Dovecot] Apple patches 1-5

Mike Abbott michael.abbott at apple.com
Tue Dec 16 18:47:32 EET 2008


> Hmm. Actually I think when I was writing that code I noticed the same
> thing and tried to fix it with:
>
> 		/* there can be multiple events for a single io.
> 		   call the callback only once if that happens. */
> 		if (io->refcount == 2 && io->io.callback != NULL)
> 			io->io.callback(io->io.context);

When there are near-duplicates in the returned events -- that is, two  
or more entries in the events array having the same udata but  
different fflags -- the refcount==2 check actually prevents the  
callback from being called at all (assuming Apple's patch to this area  
has not been applied, and the assert is removed).  The first loop  
increments the refcount twice (or more), from 1 to 3 (or higher).   
Then the second loop skips the callback entirely because the refcount  
does not equal 2.  The callback is not even called once.

> I think it would work correctly simply if the assert was removed?

Removing the assert would cause the callback to be called twice (or  
more).  Probably not good.  I know the O(n^2) algorithm to find and  
remove duplicates is undesirable but in practice n is small.


More information about the dovecot mailing list