fanotify: deny permissions when no event was sent
authorEric Paris <eparis@redhat.com>
Mon, 8 Nov 2010 23:08:14 +0000 (18:08 -0500)
committerEric Paris <eparis@redhat.com>
Tue, 7 Dec 2010 21:14:17 +0000 (16:14 -0500)
If no event was sent to userspace we cannot expect userspace to respond to
permissions requests.  Today such requests just hang forever. This patch will
deny any permissions event which was unable to be sent to userspace.

Reported-by: Tvrtko Ursulin <tvrtko.ursulin@sophos.com>
Signed-off-by: Eric Paris <eparis@redhat.com>
fs/notify/fanotify/fanotify_user.c

index 063224812b7e607879bffeedd5b90f9c4967346f..045c0794d435a71fa644aaa156c8d4644fb180e6 100644 (file)
@@ -106,7 +106,7 @@ static int create_fd(struct fsnotify_group *group, struct fsnotify_event *event)
        return client_fd;
 }
 
-static ssize_t fill_event_metadata(struct fsnotify_group *group,
+static int fill_event_metadata(struct fsnotify_group *group,
                                   struct fanotify_event_metadata *metadata,
                                   struct fsnotify_event *event)
 {
@@ -257,10 +257,11 @@ static ssize_t copy_event_to_user(struct fsnotify_group *group,
 
        pr_debug("%s: group=%p event=%p\n", __func__, group, event);
 
-       fd = fill_event_metadata(group, &fanotify_event_metadata, event);
-       if (fd < 0)
-               return fd;
+       ret = fill_event_metadata(group, &fanotify_event_metadata, event);
+       if (ret < 0)
+               goto out;
 
+       fd = ret;
        ret = prepare_for_access_response(group, event, fd);
        if (ret)
                goto out_close_fd;
@@ -275,6 +276,13 @@ out_kill_access_response:
        remove_access_response(group, event, fd);
 out_close_fd:
        sys_close(fd);
+out:
+#ifdef CONFIG_FANOTIFY_ACCESS_PERMISSIONS
+       if (event->mask & FAN_ALL_PERM_EVENTS) {
+               event->response = FAN_DENY;
+               wake_up(&group->fanotify_data.access_waitq);
+       }
+#endif
        return ret;
 }