Ted Unangst wrote: > Philip Guenther wrote: > > Yes, two _MALLOC_LEAVE calls can occur without a _MALLOC_ENTRY between them. > > > > T1 -> MALLOC_LOCK, do stuff > > T2 -> block in MALLOC_LOCK > > T1 -> MALLOC_LEAVE, MMAP() > > unmap_me is still set, but to an already unmaped region > > T2 -> return from MALLOC_LOCK, do stuff > > T1 -> block in MALLOC_ENTRY > > T2 -> MALLOC_LEAVE > > this unmaps the same unmap_me from above, which may have > > already been mapped by some other thread > > > > MALLOC_LEAVE must clear unmap_me after copying the value into local > > variables and before releasing the lock, MALLOC_ENTRY shouldn't touch > > them at all. > > AH! the light goes on. I incorrectly thought MALLOC ENTER/LEAVE were the > functions called everywhere. having a separate set of LOCK/UNLOCK calls > elsewhere is trouble. > > This could be reworked to consistently use ENTER/LEAVE, but not today.
I made the same mistake. Thanks to everyone who adopted and debugged this.