From 969a06331fd0900b4ba349a5bef841e243183562 Mon Sep 17 00:00:00 2001 From: Petro Karashchenko Date: Fri, 14 Oct 2022 16:44:26 +0200 Subject: [PATCH] fs/vfs: fix case when file to rename does not exist Signed-off-by: Petro Karashchenko --- fs/vfs/fs_rename.c | 29 +++++++++++++++++++++-------- 1 file changed, 21 insertions(+), 8 deletions(-) diff --git a/fs/vfs/fs_rename.c b/fs/vfs/fs_rename.c index 22577ed7c9..df40cc6856 100644 --- a/fs/vfs/fs_rename.c +++ b/fs/vfs/fs_rename.c @@ -397,17 +397,30 @@ next_subdir: goto next_subdir; } - else if (oldinode->u.i_mops->unlink) + else { - /* No.. newrelpath must refer to a regular file. Attempt - * to remove the file before doing the rename. - * - * NOTE that errors are not handled here. If we failed to - * remove the file, then the file system 'rename' method - * should check that. + /* No.. newrelpath must refer to a regular file. Make sure + * that the file at the olrelpath actually exists before + * performing any further actions with newrelpath */ - oldinode->u.i_mops->unlink(oldinode, newrelpath); + ret = oldinode->u.i_mops->stat(oldinode, oldrelpath, &buf); + if (ret < 0) + { + goto errout_with_newinode; + } + + if (oldinode->u.i_mops->unlink) + { + /* Attempt to remove the file before doing the rename. + * + * NOTE that errors are not handled here. If we failed + * to remove the file, then the file system 'rename' + * method should check that. + */ + + oldinode->u.i_mops->unlink(oldinode, newrelpath); + } } } }