From c366525850cfdfd2884ab9a214be21a4f66505bd Mon Sep 17 00:00:00 2001 From: Yi-Yo Chiang via Toybox Date: Sat, 24 Apr 2021 01:52:39 +0800 Subject: cpio: Don't lchown() if -t is specified When using -t to inspect an archive, cpio would try to set the owner of any symlink in the archive, even though the symlink wasn't created by the command previously. This would lead to two results, either the command fails with a "No such file or directory" message when trying to lchown() the symlink path, or an existing file, with the name of the symlink, is lchown()-ed. Guard the lchown() function call with a "if (!FLAG(t))" block, and add regression test for this. --- toys/posix/cpio.c | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) (limited to 'toys/posix') diff --git a/toys/posix/cpio.c b/toys/posix/cpio.c index 07c294f0..35b74b3b 100644 --- a/toys/posix/cpio.c +++ b/toys/posix/cpio.c @@ -166,11 +166,13 @@ void cpio_main(void) if (!test) err = mkdir(name, mode) && !FLAG(u); } else if (S_ISLNK(mode)) { data = strpad(afd, size, 0); - if (!test) err = symlink(data, name); + if (!test) { + err = symlink(data, name); + // Can't get a filehandle to a symlink, so do special chown + if (!err && !geteuid() && !FLAG(no_preserve_owner)) + err = lchown(name, uid, gid); + } free(data); - // Can't get a filehandle to a symlink, so do special chown - if (!err && !geteuid() && !FLAG(no_preserve_owner)) - err = lchown(name, uid, gid); } else if (S_ISREG(mode)) { int fd = test ? 0 : open(name, O_CREAT|O_WRONLY|O_EXCL|O_NOFOLLOW, mode); -- cgit v1.2.3