fs: avoid fdput() after failed fdget()
Subsystems (2)
v3 cover fs: avoid fdput() after failed fdget()
While debugging an unrelated problem, I noticed these two cases fdput() is called after failed fdget() while reviewing at all the fdget() and fdput() paths in the kernel.
Changes since v2:
Patches 1&2 changed to get rid of goto.
Changes since v1:
Patch 1:
Changed to address review comments to refine the code for improved readability in addition to the change to avoid fdput() on failed fdget()
Patch 2:
No change to v1. Including it in the series to keep the patches together.
Shuah Khan (2):
fs: avoid fdput() after failed fdget() in ksys_sync_file_range()
fs: avoid fdput() after failed fdget() in kernel_read_file_from_fd()
fs/exec.c | 6 +++--- fs/sync.c | 10 +++++----- 2 files changed, 8 insertions(+), 8 deletions(-)
Signature · 1 line
2.25.1
PATCH v3 1/2 fs: avoid fdput() after failed fdget() in ksys_sync_file_range()
Fix ksys_sync_file_range() to avoid fdput() after a failed fdget(). fdput() doesn't do fput() on this file since FDPUT_FPUT isn't set in fd.flags.
Change it anyway since failed fdget() doesn't require a fdput(). Refine the code path a bit for it to read more clearly.
Reference: 22f96b3808c1 ("fs: add sync_file_range() helper")
--- fs/sync.c | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-)
fs/sync.c +5 -5
@@ -365,14 +365,14 @@ int ksys_sync_file_range(int fd, loff_t offset, loff_t nbytes, unsigned int flags) {int ret; -struct fd f; +struct fd f =fdget (fd); - ret = -EBADF ; - f =fdget (fd); -if (f.file) - ret =sync_file_range (f.file, offset, nbytes, flags); +if (!f.file) +return -EBADF ; + ret =sync_file_range (f.file, offset, nbytes, flags);fdput (f); +return ret; }
Signature · 1 line
2.25.1
Re: [PATCH v3 1/2] fs: avoid fdput() after failed fdget() in ksys_sync_file_range()
Quoted 9 lines · Shuah Khan
Fix
ksys_sync_file_range()to avoidfdput()after a failedfdget().fdput()doesn't dofput()on this file sinceFDPUT_FPUTisn't set in fd.flags.Change it anyway since failed
fdget()doesn't require afdput(). Refine the code path a bit for it to read more clearly.
Reference:22f96b3808c1("fs: addsync_file_range()helper")Signed-off-by Shuah Khan <[email protected]>
Luis
PATCH v3 2/2 fs: avoid fdput() after failed fdget() in kernel_read_file_from_fd()
In reply to Shuah KhanFix kernel_read_file_from_fd() to avoid fdput() after a failed fdget(). fdput() doesn't do fput() on this file since FDPUT_FPUT isn't set in fd.flags. Fix it anyway since failed fdget() doesn't require a fdput().
This was introduced in a commit that added kernel_read_file_from_fd() as a wrapper for the VFS common kernel_read_file().
--- fs/exec.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-)
fs/exec.c +3 -3
@@ -1015,14 +1015,14 @@ int kernel_read_file_from_fd(int fd, void **buf, loff_t *size, loff_t max_size, enum kernel_read_file_id id) {struct fd f =fdget (fd); -int ret = -EBADF ; +int ret;if (!f.file) - goto out; +return -EBADF ; ret =kernel_read_file (f.file, buf, size, max_size, id); -out:fdput (f); +return ret; }EXPORT_SYMBOL_GPL (kernel_read_file_from_fd);
Signature · 1 line
2.25.1
Re: [PATCH v3 2/2] fs: avoid fdput() after failed fdget() in kernel_read_file_from_fd()
Quoted 10 lines · Shuah Khan
Fix
kernel_read_file_from_fd()to avoidfdput()after a failedfdget().fdput()doesn't dofput()on this file sinceFDPUT_FPUTisn't set in fd.flags. Fix it anyway since failedfdget()doesn't require afdput().This was introduced in a commit that added
kernel_read_file_from_fd()as a wrapper for the VFS commonkernel_read_file().Fixes b844f0ecbc56 ("vfs: define kernel_copy_file_from_fd()")Signed-off-by Shuah Khan <[email protected]>
Thanks, Shuah.