projects/linux·commit d2ea4d25

file: ensure cleanup

d2ea4d25 · Christian Brauner <[email protected]> · 2025-12-13 08:45:23 +01:00

Brown paper bag time. This is a silly oversight where I missed to drop
the error condition checking to ensure we clean up on early error
returns. I have an internal unit testset coming up for this which will
catch all such issues going forward.

Reported-by: Chris Mason <[email protected]>
Reported-by: Jeff Layton <[email protected]>
Fixes: 011703a9acd7 ("file: add FD_{ADD,PREPARE}()")
Signed-off-by: Christian Brauner <[email protected]>
Reviewed-by: Jeff Layton <[email protected]>
Signed-off-by: Linus Torvalds <[email protected]>
Commit
d2ea4d254d04a89e17504af0230c7268e3cac6bf
Parents
d552fc63

Changes

1 files changed · +6 −7

FileStatusAddDelContent
include/linux/file.hmodified+6−7View file

include/linux/file.h

View file
diff --git a/include/linux/file.h b/include/linux/file.h
index cf389fd..27484b4 100644
--- a/include/linux/file.h
+++ b/include/linux/file.h
@@ -161,12 +161,10 @@ typedef struct fd_prepare class_fd_prepare_t;
/* Do not use directly. */
static inline void class_fd_prepare_destructor(const struct fd_prepare *fdf)
{
- if (unlikely(fdf->err)) {
- if (likely(fdf->__fd >= 0))
- put_unused_fd(fdf->__fd);
- if (unlikely(!IS_ERR_OR_NULL(fdf->__file)))
- fput(fdf->__file);
- }
+ if (unlikely(fdf->__fd >= 0))
+ put_unused_fd(fdf->__fd);
+ if (unlikely(!IS_ERR_OR_NULL(fdf->__file)))
+ fput(fdf->__file);
}
/* Do not use directly. */
@@ -230,7 +228,8 @@ static inline int class_fd_prepare_lock_err(const struct fd_prepare *fdf)
VFS_WARN_ON_ONCE(fdp->__fd < 0); \
VFS_WARN_ON_ONCE(IS_ERR_OR_NULL(fdp->__file)); \
fd_install(fdp->__fd, fdp->__file); \
- fdp->__fd; \
+ retain_and_null_ptr(fdp->__file); \
+ take_fd(fdp->__fd); \
})
/* Do not use directly. */