Subject: ksiginfo_put() bug (sys/kern/kern_sig.c)
To: None <tech-kern@NetBSD.org>
From: Jaromir Dolecek <jdolecek@NetBSD.org>
List: tech-kern
Date: 10/30/2003 13:18:11
AFAICS ksiginfo_put() assumes the queue pointers are placed
first in the ksiginfo structure, which is not true since
introduction of ksi_flags. So the code trashes queue pointers
if it ever replaces a entry.
I propose following fix:
Index: kern_sig.c
===================================================================
RCS file: /cvsroot/src/sys/kern/kern_sig.c,v
retrieving revision 1.171
diff -u -p -r1.171 kern_sig.c
--- kern_sig.c 25 Oct 2003 16:50:37 -0000 1.171
+++ kern_sig.c 30 Oct 2003 12:14:06 -0000
@@ -154,10 +154,8 @@ ksiginfo_put(struct proc *p, const ksigi
{
CIRCLEQ_FOREACH(kp, &p->p_sigctx.ps_siginfo, ksi_list) {
if (kp->ksi_signo == ksi->ksi_signo) {
- CIRCLEQ_ENTRY(ksiginfo) sv;
- (void)memcpy(&sv, &kp->ksi_list, sizeof(sv));
- *kp = *ksi;
- (void)memcpy(&kp->ksi_list, &sv, sizeof(sv));
+ kp->ksi_info = ksi->ksi_info;
+ kp->ksi_flags = ksi->ksi_flags;
goto out;
}
}
Is this right?
Jaromir
--
Jaromir Dolecek <jdolecek@NetBSD.org> http://www.NetBSD.cz/
-=- We should be mindful of the potential goal, but as the tantric -=-
-=- Buddhist masters say, ``You may notice during meditation that you -=-
-=- sometimes levitate or glow. Do not let this distract you.'' -=-