On Tue, Mar 19, 2019 at 10:01 AM Michael Schlenker < michael.schlen...@contact-software.com> wrote: > > > -----Ursprüngliche Nachricht----- > > Von: Stefan Sperling [mailto:s...@stsp.name] > > Gesendet: Dienstag, 19. März 2019 15:35 > > An: Michael Schlenker <michael.schlen...@contact-software.com> > > Cc: dev@apr.apache.org > > Betreff: Re: APR thread_mutex_cleanup on windows mishandles being > > called twice > > > > On Tue, Mar 19, 2019 at 11:12:25AM +0000, Michael Schlenker wrote: > > > Hi, > > > > > > just filed https://bz.apache.org/bugzilla/show_bug.cgi?id=63271 > > > > > > (Patch attached) > > > > > > It seems to be the reason behind various crashes/restarts seen in Apache > > httpd on Windows, especially when mod_cache_disk is in use. > > > Basically when the mutex is cleaned up twice, it calls CloseHandle() > > > on uninitialized memory, which causes First Chance Exceptions in the > > > debugger (if invalid handle) or closes some random Handle behind the back > > of its real owner (e.g. internal handles of the userspace leading to access > > violations inside CreateProcess, httpd Events used to signal between parent > > and child, etc.). > > > > > > It would be great if this could make it into 1.7. > > > > > > Thanks, > > > Michael > > > > You're right that acting on a corrupt memory is bad. > > > > It looks like your proposed patch detects and then skips a redundant call to > > DeleteCriticalSection() when a mutex is unlocked twice: > > > > if (lock->type == thread_mutex_critical_section) { > > lock->type = -1; > > DeleteCriticalSection(&lock->section); > > + } > > + else if (lock->type == -1) { > > + /* do nothing */ > > } > > > > I'd prefer thread_mutex_cleanup() to loudly complain when this happens, > > and perhaps even abort the program, forcing API users to fix their code. > > Agreed. That should probably be a kind of assert that aborts or fails loud, not sure what the APR convention/function for that case would be. > > Just initializing the handle member to default INVALID_HANDLE is enough to prevent the memory corruption/freed random handles.
If this is the consensus, to avoid further corruption, I'd suggest we reset (*mutex)->handle = NULL on first close. Still should trigger a fault where it is double-closed. Won't silently continue to close random handles. And avoids the extra test. Do we agree on that band-aid?