From db9dea36fc90aaae8f4af89cd021c27da82b3922 Mon Sep 17 00:00:00 2001 From: Rafael Gieschke Date: Sun, 30 Dec 2018 23:44:12 +0100 Subject: [PATCH] lkl tools: lklfuse: Fix `lchown(2)` on symlinks Resolving symlinks on `chown()` calls will have already been handled when the call reaches the FUSE layer. Thus, `chown()` actually has to be treated as `lchown()` internally. Test (before patch): ``` truncate --size 10M test.raw mkfs.ext4 test.raw mkdir mnt lklfuse -d -o type=ext4 test.raw mnt cd mnt ln -s missing-dest test chown 100:100 test # chown: cannot dereference 'test': No such file or directory # readlink /test 4097 # unique: 247, success, outsize: 28 # unique: 248, opcode: LOOKUP (1), nodeid: 1, insize: 53, pid: 2201 # LOOKUP /missing-dest # getattr /missing-dest # unique: 248, error: -2 (No such file or directory), outsize: 16 chown 100:100 test -h # chown: changing ownership of 'test': No such file or directory # chown /test 100 100 # unique: 253, error: -2 (No such file or directory), outsize: 16 ``` Signed-off-by: Rafael Gieschke --- tools/lkl/lklfuse.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/tools/lkl/lklfuse.c b/tools/lkl/lklfuse.c index 5ab257240ca1f5..39ffd1a1d812e9 100644 --- a/tools/lkl/lklfuse.c +++ b/tools/lkl/lklfuse.c @@ -211,7 +211,8 @@ static int lklfuse_chmod(const char *path, mode_t mode) static int lklfuse_chown(const char *path, uid_t uid, gid_t gid) { - return lkl_sys_chown(path, uid, gid); + return lkl_sys_fchownat(LKL_AT_FDCWD, path, uid, gid, + LKL_AT_SYMLINK_NOFOLLOW); } static int lklfuse_truncate(const char *path, off_t off)