NetBSD-Bugs archive

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

Re: kern/41225: sys_mqueue.c mq->mq_notify_proc can disappear



The following reply was made to PR kern/41225; it has been noted by GNATS.

From: Mindaugas Rasiukevicius <rmind%netbsd.org@localhost>
To: ad%netbsd.org@localhost
Cc: gnats-bugs%NetBSD.org@localhost, netbsd-bugs%netbsd.org@localhost
Subject: Re: kern/41225: sys_mqueue.c mq->mq_notify_proc can disappear
Date: Sat, 25 Apr 2009 17:59:20 +0100

 > >Number:         41225
 > >Category:       kern
 > >Synopsis:       sys_mqueue.c mq->mq_notify_proc can disappear
 >
 > ...
 >
 > >Description:
 > Message queues are tied to file descriptors and so can live across
 > fork().
 > 
 > mq_notify() does: mq->mq_notify_proc = l->l_proc;
 > 
 > It looks like this process can exit while the mqueue still persists.
 
 When process is closing the descriptor (by exit or directly), the
 mq_notify_proc is checked by mq_close_fop():
 
 http://nxr.netbsd.org/source/xref/sys/kern/sys_mqueue.c#304
 
 Therefore it seems to be a small race condition, with window here:
 
 http://nxr.netbsd.org/source/xref/sys/kern/sys_mqueue.c#739
 
 Holding proc_lock before release of mq->mq_mtx should fix the problem:
 
 http://www.netbsd.org/~rmind/mq_kpsignal.diff
 
 Looks good?
 
 > Maybe a better solution:
 > 
 > In addition to a pid, store a generation number per struct proc.
 > Every time a pid is allocated, increment the generation number.
 > Add a p_find_gen() or similar that looks for a pid and also
 > compares the generation numbers.
 > This number could be a 64-bit system global (under proc_lock) or
 > we could have one for each pid table slot. I don't personally see
 > a big disadvantage to having a global. ??
 
 That would be a general way to ensure uniqueness. Are there any other
 users (or other usefulness) of such interface?
 
 -- 
 Best regards,
 Mindaugas
 


Home | Main Index | Thread Index | Old Index