--=_courier-19495-1052321076-0001-2
Content-Type: text/plain; charset=us-ascii; format=flowed
Content-Transfer-Encoding: 7bit
Attached is a fix.
Change log:
Fix the sig_notify filtering code for the timer_create system call to
properly check for the signal number being small enought, but only if
SIG_NONE is not specified.
Eliminate useless test of sig_notify.
george
Aniruddha M Marathe wrote:
> George,
>
> timer_create(2) fails in the case where sigev_notify parameter of
> sigevent structure is SIGEV_NONE. I believe this should not happen.
>
~snip~
>
> Line 377:
> SIGEV_NONE & ~(SIGEV_SIGNAL | SIGEV_THREAD_ID)
> = 001 & ~(000 | 100)
> = 001 & ~(100)
> = 001 & 011
> = 001
> therefore the if condition is true
> therefore the function returns NULL from line 378.
>
> Now in sys_timer_create() at line number 462
> Process = NULL
>
> Now at line 489
> if (!process) becomes TRUE
> and function returns with EINVAL
>
> Is my analysis right? If so can you comment on this behaviour?
>
Looks like a bug :( I feel a patch coming on...
-- George Anzinger george@mvista.com High-res-timers: http://sourceforge.net/projects/high-res-timers/ Preemption patch: http://www.kernel.org/pub/linux/kernel/people/rml
--=_courier-19495-1052321076-0001-2 Content-Type: text/plain; name="hrtimers-fix-signone-2.5.69-1.0.patch"; charset=iso-8859-1 Content-Transfer-Encoding: 7bit Content-Disposition: inline; filename="hrtimers-fix-signone-2.5.69-1.0.patch"
--- linux-2.5.69-org/kernel/posix-timers.c 2003-05-05 15:34:09.000000000 -0700 +++ linux/kernel/posix-timers.c 2003-05-06 00:24:21.000000000 -0700 @@ -357,13 +357,10 @@ rtn->tgid != current->tgid)) return NULL; - if ((event->sigev_notify & SIGEV_SIGNAL & MIPS_SIGEV) && + if ((event->sigev_notify & ~SIGEV_NONE & MIPS_SIGEV) && ((unsigned) (event->sigev_signo > SIGRTMAX))) return NULL; - if (event->sigev_notify & ~(SIGEV_SIGNAL | SIGEV_THREAD_ID)) - return NULL; - return rtn; }
--=_courier-19495-1052321076-0001-2--