lkml.org 
[lkml]   [2009]   [Aug]   [28]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
Patch in this message
/
Date
From
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 <ebiederm@aristanetworks.com>
>

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 <brian@xyzw.org>
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
this.

Signed-off-by: Brian Rogers <brian@xyzw.org>
---
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);
--
1.6.3.3
\
 
 \ /
  Last update: 2009-08-28 15:31    [from the cache]
©2003-2011 Jasper Spaans