[lkml]   [2009]   [Aug]   [28]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
Messages in this thread
    Patch in this message
    SubjectRe: [PATCH] inotify: Ensure we alwasy write the terminating NULL.
    Eric W. Biederman wrote:
    > Before the rewrite copy_event_to_user always wrote a terqminating '\0'
    > byte to user space after the filename. Since the rewrite that
    > terminating byte was skipped if your filename is exactly a multiple of
    > event_size. Ouch!
    > So add one byte to name_size before we round up and use clear_user to
    > set userspace to zero like /dev/zero does instead of copying the
    > strange nul_inotify_event. I can't quite convince myself len_to_zero
    > will never exceed 16 and even if it doesn't clear_user should be more
    > efficient and a more accurate reflection of what the code is trying to
    > do.
    > Signed-off-by: Eric W. Biederman <>

    I found that this change prevents my Ubuntu Karmic system from booting.
    It just idles forever very early in the process. Probably a boot script
    is waiting for an event that it doesn't receive properly.

    > - name_len = roundup(event->name_len, event_size);
    > + name_len = roundup(event->name_len + 1, event_size);

    This means the test later on will now always evaluate to true:
    > if (name_len) {

    And in cases where that test previously would have failed, the code now
    outputs a block full of zeros. Assuming that's bad and the test was
    important, I coded the attached naive fix, which is working for me.

    From 1be7a610013b47be1257d2b0296d872d6bed7416 Mon Sep 17 00:00:00 2001
    From: Brian Rogers <>
    Date: Fri, 28 Aug 2009 04:46:51 -0700
    Subject: [PATCH] inotify: Fix events with no pathname

    When an event has no pathname, there's no need to pad it with a null byte and
    therefore generate an inotify_event sized block of zeros. This fixes a
    regression introduced by commit 0db501bd0610ee0c0aca84d927f90bcccd09e2bd where
    my system wouldn't finish booting because some process was being confused by

    Signed-off-by: Brian Rogers <>
    fs/notify/inotify/inotify_user.c | 5 ++++-
    1 files changed, 4 insertions(+), 1 deletions(-)

    diff --git a/fs/notify/inotify/inotify_user.c b/fs/notify/inotify/inotify_user.c
    index 0e781bc..d94ce8b 100644
    --- a/fs/notify/inotify/inotify_user.c
    +++ b/fs/notify/inotify/inotify_user.c
    @@ -199,7 +199,10 @@ static ssize_t copy_event_to_user(struct fsnotify_group *group,
    /* round up event->name_len so it is a multiple of event_size
    * plus an extra byte for the terminating '\0'.
    - name_len = roundup(event->name_len + 1, event_size);
    + if (event->name_len > 0)
    + name_len = roundup(event->name_len + 1, event_size);
    + else
    + name_len = 0;
    inotify_event.len = name_len;

    inotify_event.mask = inotify_mask_to_arg(event->mask);
     \ /
      Last update: 2009-08-28 15:31    [W:0.022 / U:13.168 seconds]
    ©2003-2016 Jasper Spaans. hosted at Digital OceanAdvertise on this site