fanotify: fix -EOVERFLOW with large files on 64-bit
PATCH 1/1 fanotify: fix -EOVERFLOW with large files on 64-bit
From: Will Woods <[email protected]>
commit 1e2ee49f7f1b79f0b14884fe6a602f0411b39552 upstream.
On 64-bit systems, O_LARGEFILE is automatically added to flags inside the open() syscall (also openat(), blkdev_open(), etc). Userspace therefore defines O_LARGEFILE to be 0 - you can use it, but it's a no-op. Everything should be O_LARGEFILE by default.
But: when fanotify does create_fd() it uses dentry_open(), which skips all that. And userspace can't set O_LARGEFILE in fanotify_init() because it's defined to 0. So if fanotify gets an event regarding a large file, the read() will just fail with -EOVERFLOW.
This patch adds O_LARGEFILE to fanotify_init()'s event_f_flags on 64-bit systems, using the same test as open()/openat()/etc.
Addresses https://bugzilla.redhat.com/show_bug.cgi?id=696821
[snu: Backported to 3.2 / 3.10: adjusted context]
--- fs/notify/fanotify/fanotify_user.c | 3 +++ 1 file changed, 3 insertions(+)
fs/notify/fanotify/fanotify_user.c +3 -0
@@ -712,6 +712,9 @@ SYSCALL_DEFINE2(fanotify_init, unsigned int, flags, unsigned int, event_f_flags) group->fanotify_data.user = user;atomic_inc (&user->fanotify_listeners); +if (force_o_largefile ()) + event_f_flags |=O_LARGEFILE ; + group->fanotify_data.f_flags = event_f_flags;#ifdef CONFIG_FANOTIFY_ACCESS_PERMISSIONS mutex_init (&group->fanotify_data.access_mutex);
Signature · 1 line
2.15.0
Quoted 25 lines · Stefan Nuernberger
From: Will Woods <[email protected]>
commit
1e2ee49f7f1b79f0b14884fe6a602f0411b39552upstream.On 64-bit systems,
O_LARGEFILEis automatically added to flags inside theopen()syscall (alsoopenat(),blkdev_open(), etc). Userspace therefore definesO_LARGEFILEto be 0 - you can use it, but it's a no-op. Everything should beO_LARGEFILEby default.But: when fanotify does
create_fd()it usesdentry_open(), which skips all that. And userspace can't setO_LARGEFILEinfanotify_init()because it's defined to 0. So if fanotify gets an event regarding a large file, theread()will just fail with-EOVERFLOW.This patch adds
O_LARGEFILEto fanotify_init()'sevent_f_flagson 64-bit systems, using the same test as open()/openat()/etc.Addresses https://bugzilla.redhat.com/show_bug.cgi?id=696821
Signed-off-by Will Woods <[email protected]>Acked-by Eric Paris <[email protected]>Reviewed-by Jan Kara <[email protected]>Signed-off-by Andrew Morton <[email protected]>Signed-off-by Linus Torvalds <[email protected]>
Quoted 7 lines
[snu: Backported to 3.2 / 3.10: adjusted context]
Signed-off-by Stefan Nuernberger <[email protected]>Reviewed-by Pawel Wieczorkiewicz <[email protected]>Reviewed-by Simon Veith <[email protected]>Cc <[email protected]> # 3.2.x and 3.10.x
3.10.y is end-of-life :(
See the front page of www.kernel.org for that list if you are curious.
thanks,
greg k-h