Re: [BUG] problem with timer_create(2) for SIGEV_NONE ??

george anzinger (george@mvista.com)
Wed, 07 May 2003 08:21:08 -0700


This is a MIME-formatted message. If you see this text it means that your
E-mail software does not support MIME-formatted messages.

--=_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--