tech-kern archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

Re: How to prevent a mutex being _enter()ed from being _destroy()ed?



Thank you both for the detailed explanations and audits!

I'm currently running an 8.0_STABLE kernel on the machine (with 6.1_STABLE 
userland) and no panics so far. This smay be
-- luck
-- different timing that doesn't trigger the race
-- a bug fixed since 6.1

If someone remembers a bug in this area fixed since 6.1, we can stop here.


> if indeed the problem is a use-after-free arising from 
> soclose/sofree/soput that happened too early.
What I'm sure about is that the first solock() in unp_gc() calls mutex_enter() 
and the preemtion-enabling loop in mutex_vector_enter evaluates mutex_oncpu() 
(the one in the while condition) on an owner value of -16L.

What I guess is that that -16L is MUTEX_THREAD and was put there by 
MUTEX_DESTROY(), called by mutex_destroy() called by soput() by another 
thread that ran during the preemtion-enabled phase.

Any other ideas on how that -16L could go there?

Could I install some hack, that, in soput(), would panic if the socket to be
freed is the one unp_gc() is currently working on? If that would trigger, we'd 
get a useful traceback, no? And if that panic doesn't trigger, but the other 
one does, we'd know that some of my assumptions were wrong.


Home | Main Index | Thread Index | Old Index