Re: [PATCH] signalfd: fill in ssi_int for posix timers and messagequeues

From: Andrew Morton
Date: Tue Jul 20 2010 - 18:42:47 EST


On Fri, 02 Jul 2010 19:38:48 -0500
Nathan Lynch <ntl@xxxxxxxxx> wrote:

> If signalfd is used to consume a signal generated by a POSIX interval
> timer or POSIX message queue, the ssi_int field does not reflect the
> data (sigevent->sigev_value) supplied to timer_create(2) or
> mq_notify(3). (The ssi_ptr field, however, is filled in.)
>
> This behavior differs from signalfd's treatment of sigqueue-generated
> signals -- see the default case in signalfd_copyinfo. It also gives
> results that differ from the case when a signal is handled
> conventionally via a sigaction-registered handler.
>
> So, set signalfd_siginfo->ssi_int in the remaining cases (__SI_TIMER,
> __SI_MESGQ) where ssi_ptr is set.
>

This introduces an incompatibility between kernel versions. Someone
develops and tests an application on 2.6.36 or later then ships it and
lo, it malfunctions on 2.6.35 and earlier.

Is there a way to avoid that? Don't think so.

How should the more-awake-than-average application developer prevent
this problem? Should he probe the syscall at runtime to determine its
behaviour? He can't use the kernel version number because the kernel
provider might have backported this patch into an earlier kernel.

We can minimise the problem by backporting into -stable, and hoping
that awake kernel packagers understand the issue, and backport the
change as far as they can.

So it's not 100% obvious that this change is desirable. Does the
functionality which this patch adds justify the introduction of these
problems?

> ---
> fs/signalfd.c | 2 ++
> 1 files changed, 2 insertions(+), 0 deletions(-)
>
> diff --git a/fs/signalfd.c b/fs/signalfd.c
> index f329849..1c5a6ad 100644
> --- a/fs/signalfd.c
> +++ b/fs/signalfd.c
> @@ -88,6 +88,7 @@ static int signalfd_copyinfo(struct signalfd_siginfo __user *uinfo,
> err |= __put_user(kinfo->si_tid, &uinfo->ssi_tid);
> err |= __put_user(kinfo->si_overrun, &uinfo->ssi_overrun);
> err |= __put_user((long) kinfo->si_ptr, &uinfo->ssi_ptr);
> + err |= __put_user(kinfo->si_int, &uinfo->ssi_int);
> break;

hm, someone bollixed the __SI_TIMER indenting.

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/