lkml.org 
[lkml]   [2009]   [Aug]   [17]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    Date
    From
    SubjectRe: F_SETOWN_TID: F_SETOWN was thread-specific for a while
    Forgot to show the patch,

    On 08/17, Oleg Nesterov wrote:
    >
    > And again, this is even documented. The change is trivial but user-space
    > visible, it may confuse the (stupid) app which uses SIGIO + SA_SIGINFO
    > without F_SETSIG.

    Oleg.

    Personally I do not really think this change is good idea. (and in any
    case it should be re-diffed on top of Peter's OWN_EX patch).

    Btw. _in theory_, "case 0" is not right wrt security_file_send_sigiotask(sig).
    I think we shouldn't worry.

    --- a/fs/fcntl.c
    +++ b/fs/fcntl.c
    @@ -431,6 +431,7 @@ static void send_sigio_to_task(struct ta
    int fd,
    int reason)
    {
    + siginfo_t si;
    /*
    * F_SETSIG can change ->signum lockless in parallel, make
    * sure we read it once and use the same value throughout.
    @@ -439,33 +440,33 @@ static void send_sigio_to_task(struct ta

    if (!sigio_perm(p, fown, signum))
    return;
    + /* Queue a rt signal with the appropriate fd as its
    + value. We use SI_SIGIO as the source, not
    + SI_KERNEL, since kernel signals always get
    + delivered even if we can't queue. Failure to
    + queue in this case _should_ be reported; we fall
    + back to SIGIO in that case. --sct */
    + si.si_errno = 0;
    + si.si_fd = fd;
    + si.si_code = reason;
    + /* Make sure we are called with one of the POLL_*
    + reasons, otherwise we could leak kernel stack into
    + userspace. */
    + BUG_ON((reason & __SI_MASK) != __SI_POLL);
    + if (reason - POLL_IN >= NSIGPOLL)
    + si.si_band = ~0L;
    + else
    + si.si_band = band_table[reason - POLL_IN];

    switch (signum) {
    - siginfo_t si;
    default:
    - /* Queue a rt signal with the appropriate fd as its
    - value. We use SI_SIGIO as the source, not
    - SI_KERNEL, since kernel signals always get
    - delivered even if we can't queue. Failure to
    - queue in this case _should_ be reported; we fall
    - back to SIGIO in that case. --sct */
    si.si_signo = signum;
    - si.si_errno = 0;
    - si.si_code = reason;
    - /* Make sure we are called with one of the POLL_*
    - reasons, otherwise we could leak kernel stack into
    - userspace. */
    - BUG_ON((reason & __SI_MASK) != __SI_POLL);
    - if (reason - POLL_IN >= NSIGPOLL)
    - si.si_band = ~0L;
    - else
    - si.si_band = band_table[reason - POLL_IN];
    - si.si_fd = fd;
    if (!group_send_sig_info(signum, &si, p))
    break;
    /* fall-through: fall back on the old plain SIGIO signal */
    case 0:
    - group_send_sig_info(SIGIO, SEND_SIG_PRIV, p);
    + si.si_signo = SIGIO;
    + group_send_sig_info(SIGIO, &si, p);
    }
    }



    \
     
     \ /
      Last update: 2009-08-17 19:47    [W:0.034 / U:1.640 seconds]
    ©2003-2016 Jasper Spaans. hosted at Digital OceanAdvertise on this site