* [PATCHv8 1/6] fanotify: enable close-on-exec on events' fd when requested in fanotify_init() [not found] <cover.1411562410.git.ydroneaud@opteya.com> @ 2014-09-24 13:11 ` Yann Droneaud 2014-09-25 20:57 ` Heinrich Schuchardt 0 siblings, 1 reply; 16+ messages in thread From: Yann Droneaud @ 2014-09-24 13:11 UTC (permalink / raw) To: Eric Paris, Richard Guy Briggs, Al Viro, Andrew Morton Cc: linux-kernel, Yann Droneaud, linux-fsdevel, stable, linux-api According to commit 80af258867648 ('fanotify: groups can specify their f_flags for new fd'), file descriptors created as part of file access notification events inherit flags from the event_f_flags argument passed to syscall fanotify_init(2). So while it is legal for userspace to call fanotify_init() with O_CLOEXEC as part of its second argument, O_CLOEXEC is currently silently ignored. Indeed event_f_flags are only given to dentry_open(), which only seems to care about O_ACCMODE and O_PATH in do_dentry_open(), O_DIRECT in open_check_o_direct() and O_LARGEFILE in generic_file_open(). More, there's no effective check on event_f_flags value that would catch unknown / unsupported values, unlike the one on f_flags argument of the syscall (see FAN_ALL_INIT_FLAGS in include/uapi/linux/fanotify.h). Reading article "Botching up ioctls"[1] by Daniel Vetter might make one feel uncomfortable when trying to add extension to an API that doesn't check for unrecognized values. But it seems logical to set close-on-exec flag on the file descriptor if userspace is allowed to request it with O_CLOEXEC. In fact, according to some lookup on http://codesearch.debian.net/ and various search engine, there's already some userspace code requesting it: - in systemd's readahead[2]: fanotify_fd = fanotify_init(FAN_CLOEXEC|FAN_NONBLOCK, O_RDONLY|O_LARGEFILE|O_CLOEXEC|O_NOATIME); - in clsync[3]: #define FANOTIFY_EVFLAGS (O_LARGEFILE|O_RDONLY|O_CLOEXEC) int fanotify_d = fanotify_init(FANOTIFY_FLAGS, FANOTIFY_EVFLAGS); - in examples [4] from "Filesystem monitoring in the Linux kernel" article[5] by Aleksander Morgado: if ((fanotify_fd = fanotify_init (FAN_CLOEXEC, O_RDONLY | O_CLOEXEC | O_LARGEFILE)) < 0) Lookup also returned some wrong usage of the syscall: - in Gonk HAL from Mozilla Firefox OS sources[6]: mFd = fanotify_init(FAN_CLASS_NOTIF, FAN_CLOEXEC); Adding support for O_CLOEXEC in fanotify_init() won't magically enable it for Gonk since FAN_CLOEXEC is defined as 0x1, which is likely equal to O_WRONLY when used in open flag context. In the other hand, it won't hurt it either. So this patch replaces call to macro get_unused_fd() by a call to function get_unused_fd_flags() with event_f_flags value as argument. This way O_CLOEXEC flag in the second argument of fanotify_init(2) syscall is interpreted so that close-on-exec get enabled when requested. [1] http://blog.ffwll.ch/2013/11/botching-up-ioctls.html [2] http://cgit.freedesktop.org/systemd/systemd/tree/src/readahead/readahead-collect.c?id=v208#n294 [3] https://github.com/xaionaro/clsync/blob/v0.2.1/sync.c#L1631 https://github.com/xaionaro/clsync/blob/v0.2.1/configuration.h#L38 [4] http://www.lanedo.com/~aleksander/fanotify/fanotify-example.c [5] http://www.lanedo.com/2013/filesystem-monitoring-linux-kernel/ [6] http://hg.mozilla.org/mozilla-central/file/325c74addeba/hal/gonk/GonkDiskSpaceWatcher.cpp#l167 Link: http://lkml.kernel.org/r/cover.1411562410.git.ydroneaud@opteya.com Cc: Richard Guy Briggs <rgb@redhat.com> Cc: Eric Paris <eparis@redhat.com> Cc: Al Viro <viro@zeniv.linux.org.uk> Cc: Andrew Morton <akpm@linux-foundation.org> Cc: stable@vger.kernel.org Cc: linux-api@vger.kernel.org Signed-off-by: Yann Droneaud <ydroneaud@opteya.com> --- fs/notify/fanotify/fanotify_user.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/fs/notify/fanotify/fanotify_user.c b/fs/notify/fanotify/fanotify_user.c index b13992a41bd9..c991616acca9 100644 --- a/fs/notify/fanotify/fanotify_user.c +++ b/fs/notify/fanotify/fanotify_user.c @@ -78,7 +78,7 @@ static int create_fd(struct fsnotify_group *group, pr_debug("%s: group=%p event=%p\n", __func__, group, event); - client_fd = get_unused_fd(); + client_fd = get_unused_fd_flags(group->fanotify_data.f_flags); if (client_fd < 0) return client_fd; -- 1.9.3 ^ permalink raw reply related [flat|nested] 16+ messages in thread
* Re: [PATCHv8 1/6] fanotify: enable close-on-exec on events' fd when requested in fanotify_init() 2014-09-24 13:11 ` [PATCHv8 1/6] fanotify: enable close-on-exec on events' fd when requested in fanotify_init() Yann Droneaud @ 2014-09-25 20:57 ` Heinrich Schuchardt 2014-09-26 8:58 ` Yann Droneaud 0 siblings, 1 reply; 16+ messages in thread From: Heinrich Schuchardt @ 2014-09-25 20:57 UTC (permalink / raw) To: Yann Droneaud Cc: Eric Paris, Richard Guy Briggs, Al Viro, Andrew Morton, linux-kernel, linux-fsdevel, stable, linux-api, Jan Kara On 24.09.2014 15:11, Yann Droneaud wrote: > According to commit 80af258867648 ('fanotify: groups can specify > their f_flags for new fd'), file descriptors created as part of > file access notification events inherit flags from the > event_f_flags argument passed to syscall fanotify_init(2). > > So while it is legal for userspace to call fanotify_init() with > O_CLOEXEC as part of its second argument, O_CLOEXEC is currently > silently ignored. > > Indeed event_f_flags are only given to dentry_open(), which only > seems to care about O_ACCMODE and O_PATH in do_dentry_open(), > O_DIRECT in open_check_o_direct() and O_LARGEFILE in > generic_file_open(). I tested on kernel 3.17.0-rc5. I passed O_CLOEXEC in event_f_flags. When I called fcnt(event_metadata->fd, F_GETFD) it did not return FD_CLOEXEC. So I can confirm your observation that O_CLOEXEC is not working as expected. I found this definition #define get_unused_fd() get_unused_fd_flags(0) So essentially when get_unused_fd() is called for a fanotify event O_CLOEXEC is ignored. This is what your patch fixes. > > More, there's no effective check on event_f_flags value that > would catch unknown / unsupported values, unlike the one on > f_flags argument of the syscall (see FAN_ALL_INIT_FLAGS in > include/uapi/linux/fanotify.h). The fanotify_init(2) man page describes which flags are allowable in event_f_flags. Could you, please, explain why the following code in fanotify_user.c is not to be considered an effective check: if (event_f_flags & ~FANOTIFY_INIT_ALL_EVENT_F_BITS) return -EINVAL; switch (event_f_flags & O_ACCMODE) { case O_RDONLY: case O_RDWR: case O_WRONLY: break; default: return -EINVAL; } I CC Jan Kara as he reviewed the code. Best regards Heinrich Schuchardt ^ permalink raw reply [flat|nested] 16+ messages in thread
* Re: [PATCHv8 1/6] fanotify: enable close-on-exec on events' fd when requested in fanotify_init() 2014-09-25 20:57 ` Heinrich Schuchardt @ 2014-09-26 8:58 ` Yann Droneaud 2014-09-27 7:26 ` Heinrich Schuchardt 0 siblings, 1 reply; 16+ messages in thread From: Yann Droneaud @ 2014-09-26 8:58 UTC (permalink / raw) To: Heinrich Schuchardt Cc: Eric Paris, Richard Guy Briggs, Al Viro, Andrew Morton, linux-kernel, linux-fsdevel, stable, linux-api, Jan Kara, Lino Sanfilippo Hi, Le jeudi 25 septembre 2014 à 22:57 +0200, Heinrich Schuchardt a écrit : > On 24.09.2014 15:11, Yann Droneaud wrote: > > According to commit 80af258867648 ('fanotify: groups can specify > > their f_flags for new fd'), file descriptors created as part of > > file access notification events inherit flags from the > > event_f_flags argument passed to syscall fanotify_init(2). > > > > So while it is legal for userspace to call fanotify_init() with > > O_CLOEXEC as part of its second argument, O_CLOEXEC is currently > > silently ignored. > > > > Indeed event_f_flags are only given to dentry_open(), which only > > seems to care about O_ACCMODE and O_PATH in do_dentry_open(), > > O_DIRECT in open_check_o_direct() and O_LARGEFILE in > > generic_file_open(). > > I tested on kernel 3.17.0-rc5. I passed O_CLOEXEC in event_f_flags. > When I called fcnt(event_metadata->fd, F_GETFD) it did not return > FD_CLOEXEC. So I can confirm your observation that O_CLOEXEC is not > working as expected. > > I found this definition > #define get_unused_fd() get_unused_fd_flags(0) > > So essentially when get_unused_fd() is called for a fanotify event > O_CLOEXEC is ignored. > > This is what your patch fixes. > > > > > More, there's no effective check on event_f_flags value that > > would catch unknown / unsupported values, unlike the one on > > f_flags argument of the syscall (see FAN_ALL_INIT_FLAGS in > > include/uapi/linux/fanotify.h). > > The fanotify_init(2) man page describes which flags are allowable in > event_f_flags. > > Could you, please, explain why the following code in fanotify_user.c is > not to be considered an effective check: > > if (event_f_flags & ~FANOTIFY_INIT_ALL_EVENT_F_BITS) > return -EINVAL; > > switch (event_f_flags & O_ACCMODE) { > case O_RDONLY: > case O_RDWR: > case O_WRONLY: > break; > default: > return -EINVAL; > } > > I CC Jan Kara as he reviewed the code. > I missed the opportunity to update my commit message. I've sent my initial version of the patch (with the same wording) on 5th, January, 2014: http://mid.gmane.org/3d9591f81e62a78a726721c8052b3910870db35e.1388952061.git.ydroneaud@opteya.com http://lkml.kernel.org/r/3d9591f81e62a78a726721c8052b3910870db35e.1388952061.git.ydroneaud@opteya.com The patch was sent again on March, 11: http://lkml.kernel.org/r/baab31b572b216d13f2149bdf07e0f79a1bae660.1394532336.git.ydroneaud@opteya.com http://mid.gmane.org/baab31b572b216d13f2149bdf07e0f79a1bae660.1394532336.git.ydroneaud@opteya.com And another time, on June, 1st: http://lkml.kernel.org/r/2c6ab28980f0007ea3b9afa7ecd7497806a6a451.1401630396.git.ydroneaud@opteya.com http://mid.gmane.org/2c6ab28980f0007ea3b9afa7ecd7497806a6a451.1401630396.git.ydroneaud@opteya.com So as you can see, my patch predate yours: http://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/commit/?id=48149e9d3a7e924010a0daab30a6197b7d7b6580 But I have to apologize: I haven't noticed your patch was merged between my previous submission and the current one. My bad. I will update the commit message to remove my obsolete comment on the input parameter check. Thanks again for review and testing. Regards. -- Yann Droneaud OPTEYA ^ permalink raw reply [flat|nested] 16+ messages in thread
* Re: [PATCHv8 1/6] fanotify: enable close-on-exec on events' fd when requested in fanotify_init() 2014-09-26 8:58 ` Yann Droneaud @ 2014-09-27 7:26 ` Heinrich Schuchardt 2014-09-29 8:49 ` [PATCHv8.1] " Yann Droneaud 0 siblings, 1 reply; 16+ messages in thread From: Heinrich Schuchardt @ 2014-09-27 7:26 UTC (permalink / raw) To: Andrew Morton Cc: Yann Droneaud, Eric Paris, Richard Guy Briggs, Al Viro, linux-kernel, linux-fsdevel, stable, linux-api, Jan Kara, Lino Sanfilippo Hello Andrew, please, add the patch described in https://lkml.org/lkml/2014/9/24/967 to the MM tree. I have tested kernel 3.17.0-rc6 with and without the patch and it fixes the described error. As the patch is valid independent of the rest of the patch set, there is no reason to wait for the rest to be merged. You may add Reviewed by: Heinrich Schuchardt <xypron.glpk@gmx.de> Best regards Heinrich Schuchardt On 26.09.2014 10:58, Yann Droneaud wrote: > Hi, > > Le jeudi 25 septembre 2014 à 22:57 +0200, Heinrich Schuchardt a écrit : >> On 24.09.2014 15:11, Yann Droneaud wrote: >>> According to commit 80af258867648 ('fanotify: groups can specify >>> their f_flags for new fd'), file descriptors created as part of >>> file access notification events inherit flags from the >>> event_f_flags argument passed to syscall fanotify_init(2). >>> >>> So while it is legal for userspace to call fanotify_init() with >>> O_CLOEXEC as part of its second argument, O_CLOEXEC is currently >>> silently ignored. >>> >>> Indeed event_f_flags are only given to dentry_open(), which only >>> seems to care about O_ACCMODE and O_PATH in do_dentry_open(), >>> O_DIRECT in open_check_o_direct() and O_LARGEFILE in >>> generic_file_open(). >> >> I tested on kernel 3.17.0-rc5. I passed O_CLOEXEC in event_f_flags. >> When I called fcnt(event_metadata->fd, F_GETFD) it did not return >> FD_CLOEXEC. So I can confirm your observation that O_CLOEXEC is not >> working as expected. >> >> I found this definition >> #define get_unused_fd() get_unused_fd_flags(0) >> >> So essentially when get_unused_fd() is called for a fanotify event >> O_CLOEXEC is ignored. >> >> This is what your patch fixes. >> ^ permalink raw reply [flat|nested] 16+ messages in thread
* [PATCHv8.1] fanotify: enable close-on-exec on events' fd when requested in fanotify_init() 2014-09-27 7:26 ` Heinrich Schuchardt @ 2014-09-29 8:49 ` Yann Droneaud 2014-09-29 11:50 ` Jan Kara 2014-10-01 22:36 ` Andrew Morton 0 siblings, 2 replies; 16+ messages in thread From: Yann Droneaud @ 2014-09-29 8:49 UTC (permalink / raw) To: Heinrich Schuchardt, Andrew Morton Cc: Yann Droneaud, Eric Paris, Richard Guy Briggs, Al Viro, linux-kernel, linux-fsdevel, stable, linux-api, Jan Kara, Lino Sanfilippo, Valdis Kletnieks, Michael Kerrisk-manpages According to commit 80af258867648 ('fanotify: groups can specify their f_flags for new fd'), file descriptors created as part of file access notification events inherit flags from the event_f_flags argument passed to syscall fanotify_init(2). So while it is legal for userspace to call fanotify_init() with O_CLOEXEC as part of its second argument, O_CLOEXEC is currently silently ignored. Indeed event_f_flags are only given to dentry_open(), which only seems to care about O_ACCMODE and O_PATH in do_dentry_open(), O_DIRECT in open_check_o_direct() and O_LARGEFILE in generic_file_open(). But it seems logical to set close-on-exec flag on the file descriptor if userspace is allowed to request it with O_CLOEXEC. In fact, according to some lookup on http://codesearch.debian.net/ and various search engine, there's already some userspace code requesting it: - in systemd's readahead[2]: fanotify_fd = fanotify_init(FAN_CLOEXEC|FAN_NONBLOCK, O_RDONLY|O_LARGEFILE|O_CLOEXEC|O_NOATIME); - in clsync[3]: #define FANOTIFY_EVFLAGS (O_LARGEFILE|O_RDONLY|O_CLOEXEC) int fanotify_d = fanotify_init(FANOTIFY_FLAGS, FANOTIFY_EVFLAGS); - in examples [4] from "Filesystem monitoring in the Linux kernel" article[5] by Aleksander Morgado: if ((fanotify_fd = fanotify_init (FAN_CLOEXEC, O_RDONLY | O_CLOEXEC | O_LARGEFILE)) < 0) Lookup also returned some wrong usage of the syscall: - in Gonk HAL from Mozilla Firefox OS sources[6]: mFd = fanotify_init(FAN_CLASS_NOTIF, FAN_CLOEXEC); Adding support for O_CLOEXEC in fanotify_init() won't magically enable it for Gonk since FAN_CLOEXEC is defined as 0x1, which is likely equal to O_WRONLY when used in open flag context. In the other hand, it won't hurt it either. So this patch replaces call to macro get_unused_fd() by a call to function get_unused_fd_flags() with event_f_flags value as argument. This way O_CLOEXEC flag in the second argument of fanotify_init(2) syscall is interpreted so that close-on-exec get enabled when requested. [1] http://blog.ffwll.ch/2013/11/botching-up-ioctls.html [2] http://cgit.freedesktop.org/systemd/systemd/tree/src/readahead/readahead-collect.c?id=v208#n294 [3] https://github.com/xaionaro/clsync/blob/v0.2.1/sync.c#L1631 https://github.com/xaionaro/clsync/blob/v0.2.1/configuration.h#L38 [4] http://www.lanedo.com/~aleksander/fanotify/fanotify-example.c [5] http://www.lanedo.com/2013/filesystem-monitoring-linux-kernel/ [6] http://hg.mozilla.org/mozilla-central/file/325c74addeba/hal/gonk/GonkDiskSpaceWatcher.cpp#l167 Link: http://lkml.kernel.org/r/cover.1394532336.git.ydroneaud@opteya.com Cc: Heinrich Schuchardt <xypron.glpk@gmx.de> Cc: Jan Kara <jack@suse.cz> Cc: Valdis Kletnieks <Valdis.Kletnieks@vt.edu> Cc: Michael Kerrisk-manpages <mtk.manpages@gmail.com> Cc: Lino Sanfilippo <LinoSanfilippo@gmx.de> Cc: Richard Guy Briggs <rgb@redhat.com> Cc: Eric Paris <eparis@redhat.com> Cc: Al Viro <viro@zeniv.linux.org.uk> Cc: Andrew Morton <akpm@linux-foundation.org> Cc: stable@vger.kernel.org Cc: linux-api@vger.kernel.org Reviewed by: Heinrich Schuchardt <xypron.glpk@gmx.de> Signed-off-by: Yann Droneaud <ydroneaud@opteya.com> --- Hi Andrew and Henrich, Please find an updated patch with a commit message fixed regarding the obsolote comments on code which is now updated, thanks to Heinrich's patch. Changes from v8: - fixed commit message - added Reviewed-by: Regards. Yann Droneaud, OPTEYA fs/notify/fanotify/fanotify_user.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/fs/notify/fanotify/fanotify_user.c b/fs/notify/fanotify/fanotify_user.c index b13992a41bd9..c991616acca9 100644 --- a/fs/notify/fanotify/fanotify_user.c +++ b/fs/notify/fanotify/fanotify_user.c @@ -78,7 +78,7 @@ static int create_fd(struct fsnotify_group *group, pr_debug("%s: group=%p event=%p\n", __func__, group, event); - client_fd = get_unused_fd(); + client_fd = get_unused_fd_flags(group->fanotify_data.f_flags); if (client_fd < 0) return client_fd; -- 1.9.3 ^ permalink raw reply related [flat|nested] 16+ messages in thread
* Re: [PATCHv8.1] fanotify: enable close-on-exec on events' fd when requested in fanotify_init() 2014-09-29 8:49 ` [PATCHv8.1] " Yann Droneaud @ 2014-09-29 11:50 ` Jan Kara 2014-10-01 22:36 ` Andrew Morton 1 sibling, 0 replies; 16+ messages in thread From: Jan Kara @ 2014-09-29 11:50 UTC (permalink / raw) To: Yann Droneaud Cc: Heinrich Schuchardt, Andrew Morton, Eric Paris, Richard Guy Briggs, Al Viro, linux-kernel, linux-fsdevel, stable, linux-api, Jan Kara, Lino Sanfilippo, Valdis Kletnieks, Michael Kerrisk-manpages On Mon 29-09-14 10:49:15, Yann Droneaud wrote: > According to commit 80af258867648 ('fanotify: groups can specify > their f_flags for new fd'), file descriptors created as part of > file access notification events inherit flags from the > event_f_flags argument passed to syscall fanotify_init(2). > > So while it is legal for userspace to call fanotify_init() with > O_CLOEXEC as part of its second argument, O_CLOEXEC is currently > silently ignored. > > Indeed event_f_flags are only given to dentry_open(), which only > seems to care about O_ACCMODE and O_PATH in do_dentry_open(), > O_DIRECT in open_check_o_direct() and O_LARGEFILE in > generic_file_open(). > > But it seems logical to set close-on-exec flag on the file > descriptor if userspace is allowed to request it with O_CLOEXEC. > > In fact, according to some lookup on http://codesearch.debian.net/ > and various search engine, there's already some userspace code > requesting it: > > - in systemd's readahead[2]: > > fanotify_fd = fanotify_init(FAN_CLOEXEC|FAN_NONBLOCK, O_RDONLY|O_LARGEFILE|O_CLOEXEC|O_NOATIME); > > - in clsync[3]: > > #define FANOTIFY_EVFLAGS (O_LARGEFILE|O_RDONLY|O_CLOEXEC) > > int fanotify_d = fanotify_init(FANOTIFY_FLAGS, FANOTIFY_EVFLAGS); > > - in examples [4] from "Filesystem monitoring in the Linux > kernel" article[5] by Aleksander Morgado: > > if ((fanotify_fd = fanotify_init (FAN_CLOEXEC, > O_RDONLY | O_CLOEXEC | O_LARGEFILE)) < 0) > > Lookup also returned some wrong usage of the syscall: > > - in Gonk HAL from Mozilla Firefox OS sources[6]: > > mFd = fanotify_init(FAN_CLASS_NOTIF, FAN_CLOEXEC); > > Adding support for O_CLOEXEC in fanotify_init() won't magically > enable it for Gonk since FAN_CLOEXEC is defined as 0x1, which > is likely equal to O_WRONLY when used in open flag context. In > the other hand, it won't hurt it either. > > So this patch replaces call to macro get_unused_fd() by a call > to function get_unused_fd_flags() with event_f_flags value as > argument. This way O_CLOEXEC flag in the second argument of > fanotify_init(2) syscall is interpreted so that close-on-exec > get enabled when requested. > > [1] http://blog.ffwll.ch/2013/11/botching-up-ioctls.html > [2] http://cgit.freedesktop.org/systemd/systemd/tree/src/readahead/readahead-collect.c?id=v208#n294 > [3] https://github.com/xaionaro/clsync/blob/v0.2.1/sync.c#L1631 > https://github.com/xaionaro/clsync/blob/v0.2.1/configuration.h#L38 > [4] http://www.lanedo.com/~aleksander/fanotify/fanotify-example.c > [5] http://www.lanedo.com/2013/filesystem-monitoring-linux-kernel/ > [6] http://hg.mozilla.org/mozilla-central/file/325c74addeba/hal/gonk/GonkDiskSpaceWatcher.cpp#l167 > > Link: http://lkml.kernel.org/r/cover.1394532336.git.ydroneaud@opteya.com > Cc: Heinrich Schuchardt <xypron.glpk@gmx.de> > Cc: Jan Kara <jack@suse.cz> > Cc: Valdis Kletnieks <Valdis.Kletnieks@vt.edu> > Cc: Michael Kerrisk-manpages <mtk.manpages@gmail.com> > Cc: Lino Sanfilippo <LinoSanfilippo@gmx.de> > Cc: Richard Guy Briggs <rgb@redhat.com> > Cc: Eric Paris <eparis@redhat.com> > Cc: Al Viro <viro@zeniv.linux.org.uk> > Cc: Andrew Morton <akpm@linux-foundation.org> > Cc: stable@vger.kernel.org > Cc: linux-api@vger.kernel.org > Reviewed by: Heinrich Schuchardt <xypron.glpk@gmx.de> > Signed-off-by: Yann Droneaud <ydroneaud@opteya.com> The patch looks good. You can add: Reviewed-by: Jan Kara <jack@suse.cz> Honza > --- > Hi Andrew and Henrich, > > Please find an updated patch with a commit message fixed regarding > the obsolote comments on code which is now updated, thanks to > Heinrich's patch. > > Changes from v8: > - fixed commit message > - added Reviewed-by: > > Regards. > > Yann Droneaud, > OPTEYA > > fs/notify/fanotify/fanotify_user.c | 2 +- > 1 file changed, 1 insertion(+), 1 deletion(-) > > diff --git a/fs/notify/fanotify/fanotify_user.c b/fs/notify/fanotify/fanotify_user.c > index b13992a41bd9..c991616acca9 100644 > --- a/fs/notify/fanotify/fanotify_user.c > +++ b/fs/notify/fanotify/fanotify_user.c > @@ -78,7 +78,7 @@ static int create_fd(struct fsnotify_group *group, > > pr_debug("%s: group=%p event=%p\n", __func__, group, event); > > - client_fd = get_unused_fd(); > + client_fd = get_unused_fd_flags(group->fanotify_data.f_flags); > if (client_fd < 0) > return client_fd; > > -- > 1.9.3 > -- Jan Kara <jack@suse.cz> SUSE Labs, CR ^ permalink raw reply [flat|nested] 16+ messages in thread
* Re: [PATCHv8.1] fanotify: enable close-on-exec on events' fd when requested in fanotify_init() 2014-09-29 8:49 ` [PATCHv8.1] " Yann Droneaud 2014-09-29 11:50 ` Jan Kara @ 2014-10-01 22:36 ` Andrew Morton 2014-10-02 6:20 ` Yann Droneaud 2014-10-02 10:44 ` [PATCHv8.1] fanotify: enable close-on-exec on events' fd when requested in fanotify_init() Jan Kara 1 sibling, 2 replies; 16+ messages in thread From: Andrew Morton @ 2014-10-01 22:36 UTC (permalink / raw) To: Yann Droneaud Cc: Heinrich Schuchardt, Eric Paris, Richard Guy Briggs, Al Viro, linux-kernel, linux-fsdevel, stable, linux-api, Jan Kara, Lino Sanfilippo, Valdis Kletnieks, Michael Kerrisk-manpages On Mon, 29 Sep 2014 10:49:15 +0200 Yann Droneaud <ydroneaud@opteya.com> wrote: > According to commit 80af258867648 ('fanotify: groups can specify > their f_flags for new fd'), file descriptors created as part of > file access notification events inherit flags from the > event_f_flags argument passed to syscall fanotify_init(2). > > So while it is legal for userspace to call fanotify_init() with > O_CLOEXEC as part of its second argument, O_CLOEXEC is currently > silently ignored. > > Indeed event_f_flags are only given to dentry_open(), which only > seems to care about O_ACCMODE and O_PATH in do_dentry_open(), > O_DIRECT in open_check_o_direct() and O_LARGEFILE in > generic_file_open(). > > But it seems logical to set close-on-exec flag on the file > descriptor if userspace is allowed to request it with O_CLOEXEC. > > In fact, according to some lookup on http://codesearch.debian.net/ > and various search engine, there's already some userspace code > requesting it: > > - in systemd's readahead[2]: > > fanotify_fd = fanotify_init(FAN_CLOEXEC|FAN_NONBLOCK, O_RDONLY|O_LARGEFILE|O_CLOEXEC|O_NOATIME); > > - in clsync[3]: > > #define FANOTIFY_EVFLAGS (O_LARGEFILE|O_RDONLY|O_CLOEXEC) > > int fanotify_d = fanotify_init(FANOTIFY_FLAGS, FANOTIFY_EVFLAGS); > > - in examples [4] from "Filesystem monitoring in the Linux > kernel" article[5] by Aleksander Morgado: > > if ((fanotify_fd = fanotify_init (FAN_CLOEXEC, > O_RDONLY | O_CLOEXEC | O_LARGEFILE)) < 0) So we have a number of apps which are setting O_CLOEXEC, but it doesn't actually work. With this change it *will* work, so the behaviour of those apps might change, possibly breaking them? ^ permalink raw reply [flat|nested] 16+ messages in thread
* Re: [PATCHv8.1] fanotify: enable close-on-exec on events' fd when requested in fanotify_init() 2014-10-01 22:36 ` Andrew Morton @ 2014-10-02 6:20 ` Yann Droneaud 2014-10-02 6:50 ` Mihai Donțu 2014-10-02 7:52 ` [PATCH] fanotify: add a flag to allow setting O_CLOEXEC on event fd Yann Droneaud 2014-10-02 10:44 ` [PATCHv8.1] fanotify: enable close-on-exec on events' fd when requested in fanotify_init() Jan Kara 1 sibling, 2 replies; 16+ messages in thread From: Yann Droneaud @ 2014-10-02 6:20 UTC (permalink / raw) To: Andrew Morton Cc: Heinrich Schuchardt, Eric Paris, Richard Guy Briggs, Al Viro, linux-kernel, linux-fsdevel, stable, linux-api, Jan Kara, Lino Sanfilippo, Valdis Kletnieks, Michael Kerrisk-manpages, Yann Droneaud Hi, Le mercredi 01 octobre 2014 à 15:36 -0700, Andrew Morton a écrit : > On Mon, 29 Sep 2014 10:49:15 +0200 Yann Droneaud <ydroneaud@opteya.com> wrote: > > > According to commit 80af258867648 ('fanotify: groups can specify > > their f_flags for new fd'), file descriptors created as part of > > file access notification events inherit flags from the > > event_f_flags argument passed to syscall fanotify_init(2). > > > > So while it is legal for userspace to call fanotify_init() with > > O_CLOEXEC as part of its second argument, O_CLOEXEC is currently > > silently ignored. > > > > Indeed event_f_flags are only given to dentry_open(), which only > > seems to care about O_ACCMODE and O_PATH in do_dentry_open(), > > O_DIRECT in open_check_o_direct() and O_LARGEFILE in > > generic_file_open(). > > > > But it seems logical to set close-on-exec flag on the file > > descriptor if userspace is allowed to request it with O_CLOEXEC. > > > > In fact, according to some lookup on http://codesearch.debian.net/ > > and various search engine, there's already some userspace code > > requesting it: > > > > - in systemd's readahead[2]: > > > > fanotify_fd = fanotify_init(FAN_CLOEXEC|FAN_NONBLOCK, O_RDONLY|O_LARGEFILE|O_CLOEXEC|O_NOATIME); > > > > - in clsync[3]: > > > > #define FANOTIFY_EVFLAGS (O_LARGEFILE|O_RDONLY|O_CLOEXEC) > > > > int fanotify_d = fanotify_init(FANOTIFY_FLAGS, FANOTIFY_EVFLAGS); > > > > - in examples [4] from "Filesystem monitoring in the Linux > > kernel" article[5] by Aleksander Morgado: > > > > if ((fanotify_fd = fanotify_init (FAN_CLOEXEC, > > O_RDONLY | O_CLOEXEC | O_LARGEFILE)) < 0) > > So we have a number of apps which are setting O_CLOEXEC, but it doesn't > actually work. With this change it *will* work, so the behaviour of > those apps might change, possibly breaking them? > In the other hand, not enabling close-on-exec might expose unwanted file descriptor to childs, creating security issues. YMMV. -- Yann Droneaud OPTEYA ^ permalink raw reply [flat|nested] 16+ messages in thread
* Re: [PATCHv8.1] fanotify: enable close-on-exec on events' fd when requested in fanotify_init() 2014-10-02 6:20 ` Yann Droneaud @ 2014-10-02 6:50 ` Mihai Donțu 2014-10-02 7:52 ` [PATCH] fanotify: add a flag to allow setting O_CLOEXEC on event fd Yann Droneaud 1 sibling, 0 replies; 16+ messages in thread From: Mihai Donțu @ 2014-10-02 6:50 UTC (permalink / raw) To: Yann Droneaud Cc: Andrew Morton, Heinrich Schuchardt, Eric Paris, Richard Guy Briggs, Al Viro, linux-kernel, linux-fsdevel, stable, linux-api, Jan Kara, Lino Sanfilippo, Valdis Kletnieks, Michael Kerrisk-manpages On Thu, 02 Oct 2014 08:20:55 +0200 Yann Droneaud wrote: > Hi, > > Le mercredi 01 octobre 2014 à 15:36 -0700, Andrew Morton a écrit : > > On Mon, 29 Sep 2014 10:49:15 +0200 Yann Droneaud <ydroneaud@opteya.com> wrote: > > > > > According to commit 80af258867648 ('fanotify: groups can specify > > > their f_flags for new fd'), file descriptors created as part of > > > file access notification events inherit flags from the > > > event_f_flags argument passed to syscall fanotify_init(2). > > > > > > So while it is legal for userspace to call fanotify_init() with > > > O_CLOEXEC as part of its second argument, O_CLOEXEC is currently > > > silently ignored. > > > > > > Indeed event_f_flags are only given to dentry_open(), which only > > > seems to care about O_ACCMODE and O_PATH in do_dentry_open(), > > > O_DIRECT in open_check_o_direct() and O_LARGEFILE in > > > generic_file_open(). > > > > > > But it seems logical to set close-on-exec flag on the file > > > descriptor if userspace is allowed to request it with O_CLOEXEC. > > > > > > In fact, according to some lookup on http://codesearch.debian.net/ > > > and various search engine, there's already some userspace code > > > requesting it: > > > > > > - in systemd's readahead[2]: > > > > > > fanotify_fd = fanotify_init(FAN_CLOEXEC|FAN_NONBLOCK, O_RDONLY|O_LARGEFILE|O_CLOEXEC|O_NOATIME); > > > > > > - in clsync[3]: > > > > > > #define FANOTIFY_EVFLAGS (O_LARGEFILE|O_RDONLY|O_CLOEXEC) > > > > > > int fanotify_d = fanotify_init(FANOTIFY_FLAGS, FANOTIFY_EVFLAGS); > > > > > > - in examples [4] from "Filesystem monitoring in the Linux > > > kernel" article[5] by Aleksander Morgado: > > > > > > if ((fanotify_fd = fanotify_init (FAN_CLOEXEC, > > > O_RDONLY | O_CLOEXEC | O_LARGEFILE)) < 0) > > > > So we have a number of apps which are setting O_CLOEXEC, but it doesn't > > actually work. With this change it *will* work, so the behaviour of > > those apps might change, possibly breaking them? > > > > In the other hand, not enabling close-on-exec might expose unwanted file > descriptor to childs, creating security issues. YMMV. > As someone who uses fanotify for content introspection, I can say that I am _explicitly_ marking the fd obtained via read() as O_CLOEXEC, because I have encountered a situation where a child managed to create a deadlock because it kept the fd open after the main application responded with FAN_ALLOW. -- Mihai Donțu ^ permalink raw reply [flat|nested] 16+ messages in thread
* [PATCH] fanotify: add a flag to allow setting O_CLOEXEC on event fd 2014-10-02 6:20 ` Yann Droneaud 2014-10-02 6:50 ` Mihai Donțu @ 2014-10-02 7:52 ` Yann Droneaud 2014-10-02 9:13 ` Pádraig Brady 1 sibling, 1 reply; 16+ messages in thread From: Yann Droneaud @ 2014-10-02 7:52 UTC (permalink / raw) To: Andrew Morton Cc: Yann Droneaud, Heinrich Schuchardt, Eric Paris, Richard Guy Briggs, Al Viro, linux-kernel, linux-fsdevel, stable, linux-api, Jan Kara, Lino Sanfilippo, Valdis Kletnieks, Michael Kerrisk-manpages In order to not potentially break applications which were requesting O_CLOEXEC on event file descriptors but which actually need it to be not effective as the kernel currently ignore the flag, so the file descriptor is inherited accross exec regardless of O_CLOEXEC (please forgive me for the wording), this patch introduces FAN_FD_CLOEXEC flag to fanotify_init() so that application can request O_CLOEXEC to be effective. Newer application would use FAN_FD_CLOEXEC flag along O_CLOEXEC to enable close on exec on newly created file descriptor: fd = fanotify_init(FAN_CLOEXEC|FAN_NONBLOCK|FAN_FD_CLOEXEC, O_RDONLY|O_LARGEFILE|O_CLOEXEC|O_NOATIME); Signed-off-by: Yann Droneaud <ydroneaud@opteya.com> --- Hi Andrew, While I believe fanotify_init() must enable close-on-exec when requested by userspace to prevent unwelcomed security issue, I understand your concerns regarding the possible breakage on userspace application requesting O_CLOEXEC but relying on it not being enable on file descriptor created for the events. So with a new flag to fanotify_init(), we could allow newer applications to really enable O_CLOEXEC. But I feel bad to have to force application to specify twice they want close on exec: - are you sure ? - are you really sure ? - is this your final answer ? ... Regards. Yann Droneaud OPTEYA fs/notify/fanotify/fanotify_user.c | 6 +++++- include/uapi/linux/fanotify.h | 5 ++++- 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/fs/notify/fanotify/fanotify_user.c b/fs/notify/fanotify/fanotify_user.c index c991616acca9..3c1fb1412f37 100644 --- a/fs/notify/fanotify/fanotify_user.c +++ b/fs/notify/fanotify/fanotify_user.c @@ -78,7 +78,7 @@ static int create_fd(struct fsnotify_group *group, pr_debug("%s: group=%p event=%p\n", __func__, group, event); - client_fd = get_unused_fd_flags(group->fanotify_data.f_flags); + client_fd = get_unused_fd_flags(group->fanotify_data.f_flags & O_CLOEXEC); if (client_fd < 0) return client_fd; @@ -706,6 +706,10 @@ SYSCALL_DEFINE2(fanotify_init, unsigned int, flags, unsigned int, event_f_flags) return -EINVAL; } + if ((event_f_flags & O_CLOEXEC) && + !(flags & FAN_FD_CLOEXEC)) + event_f_flags ^= O_CLOEXEC; + user = get_current_user(); if (atomic_read(&user->fanotify_listeners) > FANOTIFY_DEFAULT_MAX_LISTENERS) { free_uid(user); diff --git a/include/uapi/linux/fanotify.h b/include/uapi/linux/fanotify.h index 030508d195d3..f2d517be3152 100644 --- a/include/uapi/linux/fanotify.h +++ b/include/uapi/linux/fanotify.h @@ -36,7 +36,10 @@ #define FAN_UNLIMITED_QUEUE 0x00000010 #define FAN_UNLIMITED_MARKS 0x00000020 -#define FAN_ALL_INIT_FLAGS (FAN_CLOEXEC | FAN_NONBLOCK | \ +/* flags used for fanotify_init() too */ +#define FAN_FD_CLOEXEC 0x00000100 + +#define FAN_ALL_INIT_FLAGS (FAN_CLOEXEC | FAN_NONBLOCK | FAN_FD_CLOEXEC | \ FAN_ALL_CLASS_BITS | FAN_UNLIMITED_QUEUE |\ FAN_UNLIMITED_MARKS) -- 1.9.3 ^ permalink raw reply related [flat|nested] 16+ messages in thread
* Re: [PATCH] fanotify: add a flag to allow setting O_CLOEXEC on event fd 2014-10-02 7:52 ` [PATCH] fanotify: add a flag to allow setting O_CLOEXEC on event fd Yann Droneaud @ 2014-10-02 9:13 ` Pádraig Brady 2014-10-02 11:55 ` Michael Kerrisk (man-pages) 2014-10-02 14:44 ` Yann Droneaud 0 siblings, 2 replies; 16+ messages in thread From: Pádraig Brady @ 2014-10-02 9:13 UTC (permalink / raw) To: Yann Droneaud Cc: Andrew Morton, Heinrich Schuchardt, Eric Paris, Richard Guy Briggs, Al Viro, linux-kernel, linux-fsdevel, stable, linux-api, Jan Kara, Lino Sanfilippo, Valdis Kletnieks, Michael Kerrisk-manpages On 10/02/2014 08:52 AM, Yann Droneaud wrote: > In order to not potentially break applications which were > requesting O_CLOEXEC on event file descriptors but which > actually need it to be not effective as the kernel currently > ignore the flag, so the file descriptor is inherited accross > exec regardless of O_CLOEXEC (please forgive me for the > wording), this patch introduces FAN_FD_CLOEXEC flag to > fanotify_init() so that application can request O_CLOEXEC > to be effective. > Newer application would use FAN_FD_CLOEXEC flag along > O_CLOEXEC to enable close on exec on newly created > file descriptor: > > fd = fanotify_init(FAN_CLOEXEC|FAN_NONBLOCK|FAN_FD_CLOEXEC, > O_RDONLY|O_LARGEFILE|O_CLOEXEC|O_NOATIME); Ugh really? IMHO there should be widespread or at least known breakage with O_CLOEXEC before adding messiness like this. It seems surprising to me that apps that would depend on O_CLOEXEC being ineffective. please reconsider this one. thanks, P�draig. ^ permalink raw reply [flat|nested] 16+ messages in thread
* Re: [PATCH] fanotify: add a flag to allow setting O_CLOEXEC on event fd 2014-10-02 9:13 ` Pádraig Brady @ 2014-10-02 11:55 ` Michael Kerrisk (man-pages) 2014-10-02 14:44 ` Yann Droneaud 1 sibling, 0 replies; 16+ messages in thread From: Michael Kerrisk (man-pages) @ 2014-10-02 11:55 UTC (permalink / raw) To: Pádraig Brady Cc: Yann Droneaud, Andrew Morton, Heinrich Schuchardt, Eric Paris, Richard Guy Briggs, Al Viro, lkml, linux-fsdevel@vger.kernel.org, stable, Linux API, Jan Kara, Lino Sanfilippo, Valdis Kletnieks On Thu, Oct 2, 2014 at 11:13 AM, Pádraig Brady <P@draigbrady.com> wrote: > On 10/02/2014 08:52 AM, Yann Droneaud wrote: >> In order to not potentially break applications which were >> requesting O_CLOEXEC on event file descriptors but which >> actually need it to be not effective as the kernel currently >> ignore the flag, so the file descriptor is inherited accross >> exec regardless of O_CLOEXEC (please forgive me for the >> wording), this patch introduces FAN_FD_CLOEXEC flag to >> fanotify_init() so that application can request O_CLOEXEC >> to be effective. >> Newer application would use FAN_FD_CLOEXEC flag along >> O_CLOEXEC to enable close on exec on newly created >> file descriptor: >> >> fd = fanotify_init(FAN_CLOEXEC|FAN_NONBLOCK|FAN_FD_CLOEXEC, >> O_RDONLY|O_LARGEFILE|O_CLOEXEC|O_NOATIME); > > Ugh really? > IMHO there should be widespread or at least known breakage with > O_CLOEXEC before adding messiness like this. > It seems surprising to me that apps that would depend on > O_CLOEXEC being ineffective. > > please reconsider this one. Agreed. The number of applications for which there are silent (not *yet* observed) breakages because O_CLOEXEC is not working as expected is likely rather larger than the set of applications that randomly specify O_CLOEXEC and then somehow get broken as a result. Cheers, Michael -- Michael Kerrisk Linux man-pages maintainer; http://www.kernel.org/doc/man-pages/ Linux/UNIX System Programming Training: http://man7.org/training/ ^ permalink raw reply [flat|nested] 16+ messages in thread
* Re: [PATCH] fanotify: add a flag to allow setting O_CLOEXEC on event fd 2014-10-02 9:13 ` Pádraig Brady 2014-10-02 11:55 ` Michael Kerrisk (man-pages) @ 2014-10-02 14:44 ` Yann Droneaud 1 sibling, 0 replies; 16+ messages in thread From: Yann Droneaud @ 2014-10-02 14:44 UTC (permalink / raw) To: Pádraig Brady Cc: Andrew Morton, Heinrich Schuchardt, Eric Paris, Richard Guy Briggs, Al Viro, linux-kernel, linux-fsdevel, stable, linux-api, Jan Kara, Lino Sanfilippo, Valdis Kletnieks, Michael Kerrisk-manpages, Yann Droneaud Hi, Le jeudi 02 octobre 2014 à 10:13 +0100, Pádraig Brady a écrit : > On 10/02/2014 08:52 AM, Yann Droneaud wrote: > > In order to not potentially break applications which were > > requesting O_CLOEXEC on event file descriptors but which > > actually need it to be not effective as the kernel currently > > ignore the flag, so the file descriptor is inherited accross > > exec regardless of O_CLOEXEC (please forgive me for the > > wording), this patch introduces FAN_FD_CLOEXEC flag to > > fanotify_init() so that application can request O_CLOEXEC > > to be effective. > > Newer application would use FAN_FD_CLOEXEC flag along > > O_CLOEXEC to enable close on exec on newly created > > file descriptor: > > > > fd = fanotify_init(FAN_CLOEXEC|FAN_NONBLOCK|FAN_FD_CLOEXEC, > > O_RDONLY|O_LARGEFILE|O_CLOEXEC|O_NOATIME); > > Ugh really? > IMHO there should be widespread or at least known breakage with > O_CLOEXEC before adding messiness like this. You should have read the other part of my message: > > While I believe fanotify_init() must enable close-on-exec > > when requested by userspace to prevent unwelcomed security > > issue, I understand your concerns regarding the possible > > breakage on userspace application requesting O_CLOEXEC > > but relying on it not being enable on file descriptor > > created for the events. > > > So with a new flag to fanotify_init(), we could allow > > newer applications to really enable O_CLOEXEC. > > > But I feel bad to have to force application to specify > > twice they want close on exec: > > - are you sure ? > > - are you really sure ? > > - is this your final answer ? > > ... I'm not really fond of this option. > It seems surprising to me that apps that would depend on > O_CLOEXEC being ineffective. > We have seen userspace developers making mistakes, and those mistakes were mistakenly ignored by the kernel until someone try to fix the mistake on kernel side, which broke the existing userspace application. > please reconsider this one. > I'm not going to promote this patch as it's a quick and dirty hack to demonstrate what would be the other option. Regards. -- Yann Droneaud OPTEYA ^ permalink raw reply [flat|nested] 16+ messages in thread
* Re: [PATCHv8.1] fanotify: enable close-on-exec on events' fd when requested in fanotify_init() 2014-10-01 22:36 ` Andrew Morton 2014-10-02 6:20 ` Yann Droneaud @ 2014-10-02 10:44 ` Jan Kara 2014-10-02 19:46 ` Andrew Morton 1 sibling, 1 reply; 16+ messages in thread From: Jan Kara @ 2014-10-02 10:44 UTC (permalink / raw) To: Andrew Morton Cc: Yann Droneaud, Heinrich Schuchardt, Eric Paris, Richard Guy Briggs, Al Viro, linux-kernel, linux-fsdevel, stable, linux-api, Jan Kara, Lino Sanfilippo, Valdis Kletnieks, Michael Kerrisk-manpages On Wed 01-10-14 15:36:21, Andrew Morton wrote: > On Mon, 29 Sep 2014 10:49:15 +0200 Yann Droneaud <ydroneaud@opteya.com> wrote: > > > According to commit 80af258867648 ('fanotify: groups can specify > > their f_flags for new fd'), file descriptors created as part of > > file access notification events inherit flags from the > > event_f_flags argument passed to syscall fanotify_init(2). > > > > So while it is legal for userspace to call fanotify_init() with > > O_CLOEXEC as part of its second argument, O_CLOEXEC is currently > > silently ignored. > > > > Indeed event_f_flags are only given to dentry_open(), which only > > seems to care about O_ACCMODE and O_PATH in do_dentry_open(), > > O_DIRECT in open_check_o_direct() and O_LARGEFILE in > > generic_file_open(). > > > > But it seems logical to set close-on-exec flag on the file > > descriptor if userspace is allowed to request it with O_CLOEXEC. > > > > In fact, according to some lookup on http://codesearch.debian.net/ > > and various search engine, there's already some userspace code > > requesting it: > > > > - in systemd's readahead[2]: > > > > fanotify_fd = fanotify_init(FAN_CLOEXEC|FAN_NONBLOCK, O_RDONLY|O_LARGEFILE|O_CLOEXEC|O_NOATIME); > > > > - in clsync[3]: > > > > #define FANOTIFY_EVFLAGS (O_LARGEFILE|O_RDONLY|O_CLOEXEC) > > > > int fanotify_d = fanotify_init(FANOTIFY_FLAGS, FANOTIFY_EVFLAGS); > > > > - in examples [4] from "Filesystem monitoring in the Linux > > kernel" article[5] by Aleksander Morgado: > > > > if ((fanotify_fd = fanotify_init (FAN_CLOEXEC, > > O_RDONLY | O_CLOEXEC | O_LARGEFILE)) < 0) > > So we have a number of apps which are setting O_CLOEXEC, but it doesn't > actually work. With this change it *will* work, so the behaviour of > those apps might change, possibly breaking them? Possibly. OTOH I'd dare to say that most of the apps specifying O_CLOEXEC want that behavior and their security may be weakened by the fact that O_CLOEXEC is ignored. So we are weighting possible security issues for apps doing things right (and Mihai mentioned in this thread that at least he has an application which needs O_CLOEXEC working) against possible breakage for apps which just randomly set O_CLOEXEC without wanting. So I'm really for fixing O_CLOEXEC behavior. Honza -- Jan Kara <jack@suse.cz> SUSE Labs, CR ^ permalink raw reply [flat|nested] 16+ messages in thread
* Re: [PATCHv8.1] fanotify: enable close-on-exec on events' fd when requested in fanotify_init() 2014-10-02 10:44 ` [PATCHv8.1] fanotify: enable close-on-exec on events' fd when requested in fanotify_init() Jan Kara @ 2014-10-02 19:46 ` Andrew Morton 2014-10-03 8:39 ` [PATCHv8.2] " Yann Droneaud 0 siblings, 1 reply; 16+ messages in thread From: Andrew Morton @ 2014-10-02 19:46 UTC (permalink / raw) To: Jan Kara Cc: Yann Droneaud, Heinrich Schuchardt, Eric Paris, Richard Guy Briggs, Al Viro, linux-kernel, linux-fsdevel, stable, linux-api, Lino Sanfilippo, Valdis Kletnieks, Michael Kerrisk-manpages On Thu, 2 Oct 2014 12:44:10 +0200 Jan Kara <jack@suse.cz> wrote: > On Wed 01-10-14 15:36:21, Andrew Morton wrote: > > On Mon, 29 Sep 2014 10:49:15 +0200 Yann Droneaud <ydroneaud@opteya.com> wrote: > > > > > According to commit 80af258867648 ('fanotify: groups can specify > > > their f_flags for new fd'), file descriptors created as part of > > > file access notification events inherit flags from the > > > event_f_flags argument passed to syscall fanotify_init(2). > > > > > > So while it is legal for userspace to call fanotify_init() with > > > O_CLOEXEC as part of its second argument, O_CLOEXEC is currently > > > silently ignored. > > > > > > Indeed event_f_flags are only given to dentry_open(), which only > > > seems to care about O_ACCMODE and O_PATH in do_dentry_open(), > > > O_DIRECT in open_check_o_direct() and O_LARGEFILE in > > > generic_file_open(). > > > > > > But it seems logical to set close-on-exec flag on the file > > > descriptor if userspace is allowed to request it with O_CLOEXEC. > > > > > > In fact, according to some lookup on http://codesearch.debian.net/ > > > and various search engine, there's already some userspace code > > > requesting it: > > > > > > - in systemd's readahead[2]: > > > > > > fanotify_fd = fanotify_init(FAN_CLOEXEC|FAN_NONBLOCK, O_RDONLY|O_LARGEFILE|O_CLOEXEC|O_NOATIME); > > > > > > - in clsync[3]: > > > > > > #define FANOTIFY_EVFLAGS (O_LARGEFILE|O_RDONLY|O_CLOEXEC) > > > > > > int fanotify_d = fanotify_init(FANOTIFY_FLAGS, FANOTIFY_EVFLAGS); > > > > > > - in examples [4] from "Filesystem monitoring in the Linux > > > kernel" article[5] by Aleksander Morgado: > > > > > > if ((fanotify_fd = fanotify_init (FAN_CLOEXEC, > > > O_RDONLY | O_CLOEXEC | O_LARGEFILE)) < 0) > > > > So we have a number of apps which are setting O_CLOEXEC, but it doesn't > > actually work. With this change it *will* work, so the behaviour of > > those apps might change, possibly breaking them? > Possibly. OTOH I'd dare to say that most of the apps specifying O_CLOEXEC > want that behavior and their security may be weakened by the fact that > O_CLOEXEC is ignored. So we are weighting possible security issues for apps > doing things right (and Mihai mentioned in this thread that at least he has > an application which needs O_CLOEXEC working) against possible breakage for > apps which just randomly set O_CLOEXEC without wanting. So I'm really for > fixing O_CLOEXEC behavior. Fair enough, it sounds like the risk is acceptable. Can we get a new version sent out with all this new info appropriately changelogged? ^ permalink raw reply [flat|nested] 16+ messages in thread
* [PATCHv8.2] fanotify: enable close-on-exec on events' fd when requested in fanotify_init() 2014-10-02 19:46 ` Andrew Morton @ 2014-10-03 8:39 ` Yann Droneaud 0 siblings, 0 replies; 16+ messages in thread From: Yann Droneaud @ 2014-10-03 8:39 UTC (permalink / raw) To: Andrew Morton Cc: Yann Droneaud, Jan Kara, Heinrich Schuchardt, Eric Paris, Richard Guy Briggs, Al Viro, linux-kernel, linux-fsdevel, stable, linux-api, Lino Sanfilippo, Valdis Kletnieks, Michael Kerrisk-manpages, Mihai Donțu, Pádraig Brady According to commit 80af258867648 ('fanotify: groups can specify their f_flags for new fd'), file descriptors created as part of file access notification events inherit flags from the event_f_flags argument passed to syscall fanotify_init(2)[1]. Unfortunately O_CLOEXEC is currently silently ignored. Indeed, event_f_flags are only given to dentry_open(), which only seems to care about O_ACCMODE and O_PATH in do_dentry_open(), O_DIRECT in open_check_o_direct() and O_LARGEFILE in generic_file_open(). It's a pity, since, according to some lookup on various search engines and http://codesearch.debian.net/, there's already some userspace code which use O_CLOEXEC: - in systemd's readahead[2]: fanotify_fd = fanotify_init(FAN_CLOEXEC|FAN_NONBLOCK, O_RDONLY|O_LARGEFILE|O_CLOEXEC|O_NOATIME); - in clsync[3]: #define FANOTIFY_EVFLAGS (O_LARGEFILE|O_RDONLY|O_CLOEXEC) int fanotify_d = fanotify_init(FANOTIFY_FLAGS, FANOTIFY_EVFLAGS); - in examples [4] from "Filesystem monitoring in the Linux kernel" article[5] by Aleksander Morgado: if ((fanotify_fd = fanotify_init (FAN_CLOEXEC, O_RDONLY | O_CLOEXEC | O_LARGEFILE)) < 0) Additionally, since commit 48149e9d3a7e ('fanotify: check file flags passed in fanotify_init'). having O_CLOEXEC as part of fanotify_init() second argument is expressly allowed. So it seems expected to set close-on-exec flag on the file descriptors if userspace is allowed to request it with O_CLOEXEC. But Andrew Morton raised[6] the concern that enabling now close-on-exec might break existing applications which ask for O_CLOEXEC but expect the file descriptor to be inherited across exec(). In the other hand, as reported by Mihai Donțu[7], not setting close-on-exec on the file descriptor returned as part of file access notify can break applications due to deadlock. So close-on-exec is needed for most applications. More, applications asking for close-on-exec are likely expecting it to be enabled, relying on O_CLOEXEC being effective. If not, it might weaken their security, as noted by Jan Kara[8]. So this patch replaces call to macro get_unused_fd() by a call to function get_unused_fd_flags() with event_f_flags value as argument. This way O_CLOEXEC flag in the second argument of fanotify_init(2) syscall is interpreted and close-on-exec get enabled when requested. [1] http://man7.org/linux/man-pages/man2/fanotify_init.2.html [2] http://cgit.freedesktop.org/systemd/systemd/tree/src/readahead/readahead-collect.c?id=v208#n294 [3] https://github.com/xaionaro/clsync/blob/v0.2.1/sync.c#L1631 https://github.com/xaionaro/clsync/blob/v0.2.1/configuration.h#L38 [4] http://www.lanedo.com/~aleksander/fanotify/fanotify-example.c [5] http://www.lanedo.com/2013/filesystem-monitoring-linux-kernel/ [6] http://lkml.kernel.org/r/20141001153621.65e9258e65a6167bf2e4cb50@linux-foundation.org [7] http://lkml.kernel.org/r/20141002095046.3715eb69@mdontu-l [8] http://lkml.kernel.org/r/20141002104410.GB19748@quack.suse.cz Link: http://lkml.kernel.org/r/cover.1411562410.git.ydroneaud@opteya.com Cc: Mihai Donțu <mihai.dontu@gmail.com> Cc: Pádraig Brady <P@draigBrady.com> Cc: Heinrich Schuchardt <xypron.glpk@gmx.de> Cc: Jan Kara <jack@suse.cz> Cc: Valdis Kletnieks <Valdis.Kletnieks@vt.edu> Cc: Michael Kerrisk-manpages <mtk.manpages@gmail.com> Cc: Lino Sanfilippo <LinoSanfilippo@gmx.de> Cc: Richard Guy Briggs <rgb@redhat.com> Cc: Eric Paris <eparis@redhat.com> Cc: Al Viro <viro@zeniv.linux.org.uk> Cc: Andrew Morton <akpm@linux-foundation.org> Cc: stable@vger.kernel.org Cc: linux-api@vger.kernel.org Reviewed-by: Jan Kara <jack@suse.cz> Reviewed by: Heinrich Schuchardt <xypron.glpk@gmx.de> Tested-by: Heinrich Schuchardt <xypron.glpk@gmx.de> Signed-off-by: Yann Droneaud <ydroneaud@opteya.com> --- Hi Andrew, > Fair enough, it sounds like the risk is acceptable. > OK. > Can we get a new version sent out with all this new info appropriately > changelogged? > Of course ! Please find an updated patch with revamped commit message. Changes from v8.1: - added more Cc: - added Reviewed-by: - rewrote commit message. fs/notify/fanotify/fanotify_user.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/fs/notify/fanotify/fanotify_user.c b/fs/notify/fanotify/fanotify_user.c index b13992a41bd9..c991616acca9 100644 --- a/fs/notify/fanotify/fanotify_user.c +++ b/fs/notify/fanotify/fanotify_user.c @@ -78,7 +78,7 @@ static int create_fd(struct fsnotify_group *group, pr_debug("%s: group=%p event=%p\n", __func__, group, event); - client_fd = get_unused_fd(); + client_fd = get_unused_fd_flags(group->fanotify_data.f_flags); if (client_fd < 0) return client_fd; -- 1.9.3 ^ permalink raw reply related [flat|nested] 16+ messages in thread
end of thread, other threads:[~2014-10-03 8:39 UTC | newest]
Thread overview: 16+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
[not found] <cover.1411562410.git.ydroneaud@opteya.com>
2014-09-24 13:11 ` [PATCHv8 1/6] fanotify: enable close-on-exec on events' fd when requested in fanotify_init() Yann Droneaud
2014-09-25 20:57 ` Heinrich Schuchardt
2014-09-26 8:58 ` Yann Droneaud
2014-09-27 7:26 ` Heinrich Schuchardt
2014-09-29 8:49 ` [PATCHv8.1] " Yann Droneaud
2014-09-29 11:50 ` Jan Kara
2014-10-01 22:36 ` Andrew Morton
2014-10-02 6:20 ` Yann Droneaud
2014-10-02 6:50 ` Mihai Donțu
2014-10-02 7:52 ` [PATCH] fanotify: add a flag to allow setting O_CLOEXEC on event fd Yann Droneaud
2014-10-02 9:13 ` Pádraig Brady
2014-10-02 11:55 ` Michael Kerrisk (man-pages)
2014-10-02 14:44 ` Yann Droneaud
2014-10-02 10:44 ` [PATCHv8.1] fanotify: enable close-on-exec on events' fd when requested in fanotify_init() Jan Kara
2014-10-02 19:46 ` Andrew Morton
2014-10-03 8:39 ` [PATCHv8.2] " Yann Droneaud
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for NNTP newsgroup(s).