aboutsummaryrefslogtreecommitdiffstats
path: root/fs
diff options
context:
space:
mode:
authorEric Paris <eparis@redhat.com>2010-11-08 18:08:14 -0500
committerEric Paris <eparis@redhat.com>2010-12-07 16:14:17 -0500
commitecf6f5e7d68471b08603f7c20143ac236602364f (patch)
treefb6fc404022d4674c2cb8e9a31f98a719a316e14 /fs
parente8a7e48bb248a1196484d3f8afa53bded2b24e71 (diff)
fanotify: deny permissions when no event was sent
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>
Diffstat (limited to 'fs')
-rw-r--r--fs/notify/fanotify/fanotify_user.c16
1 files changed, 12 insertions, 4 deletions
diff --git a/fs/notify/fanotify/fanotify_user.c b/fs/notify/fanotify/fanotify_user.c
index 063224812b7e..045c0794d435 100644
--- a/fs/notify/fanotify/fanotify_user.c
+++ b/fs/notify/fanotify/fanotify_user.c
@@ -106,7 +106,7 @@ static int create_fd(struct fsnotify_group *group, struct fsnotify_event *event)
106 return client_fd; 106 return client_fd;
107} 107}
108 108
109static ssize_t fill_event_metadata(struct fsnotify_group *group, 109static int fill_event_metadata(struct fsnotify_group *group,
110 struct fanotify_event_metadata *metadata, 110 struct fanotify_event_metadata *metadata,
111 struct fsnotify_event *event) 111 struct fsnotify_event *event)
112{ 112{
@@ -257,10 +257,11 @@ static ssize_t copy_event_to_user(struct fsnotify_group *group,
257 257
258 pr_debug("%s: group=%p event=%p\n", __func__, group, event); 258 pr_debug("%s: group=%p event=%p\n", __func__, group, event);
259 259
260 fd = fill_event_metadata(group, &fanotify_event_metadata, event); 260 ret = fill_event_metadata(group, &fanotify_event_metadata, event);
261 if (fd < 0) 261 if (ret < 0)
262 return fd; 262 goto out;
263 263
264 fd = ret;
264 ret = prepare_for_access_response(group, event, fd); 265 ret = prepare_for_access_response(group, event, fd);
265 if (ret) 266 if (ret)
266 goto out_close_fd; 267 goto out_close_fd;
@@ -275,6 +276,13 @@ out_kill_access_response:
275 remove_access_response(group, event, fd); 276 remove_access_response(group, event, fd);
276out_close_fd: 277out_close_fd:
277 sys_close(fd); 278 sys_close(fd);
279out:
280#ifdef CONFIG_FANOTIFY_ACCESS_PERMISSIONS
281 if (event->mask & FAN_ALL_PERM_EVENTS) {
282 event->response = FAN_DENY;
283 wake_up(&group->fanotify_data.access_waitq);
284 }
285#endif
278 return ret; 286 return ret;
279} 287}
280 288