]> git.ipfire.org Git - thirdparty/xz.git/commitdiff
xz: Avoid fchown(2) failure.
authorAlexander Bluhm <alexander.bluhm@gmx.net>
Tue, 5 Oct 2021 21:33:16 +0000 (23:33 +0200)
committerLasse Collin <lasse.collin@tukaani.org>
Tue, 12 Jul 2022 16:01:09 +0000 (19:01 +0300)
OpenBSD does not allow to change the group of a file if the user
does not belong to this group.  In contrast to Linux, OpenBSD also
fails if the new group is the same as the old one.  Do not call
fchown(2) in this case, it would change nothing anyway.

This fixes an issue with Perl Alien::Build module.
https://github.com/PerlAlien/Alien-Build/issues/62

src/xz/file_io.c

index 0ba8db8fbc4ccba7024a3af54e0ba75268b619e6..676508dc07f7d599d9b5d505689520baf6fdf3f0 100644 (file)
@@ -368,7 +368,13 @@ io_copy_attrs(const file_pair *pair)
 
        mode_t mode;
 
-       if (fchown(pair->dest_fd, (uid_t)(-1), pair->src_st.st_gid)) {
+       // With BSD semantics the new dest file may have a group that
+       // does not belong to the user.  If the src file has the same gid
+       // nothing has to be done.  Nevertheless OpenBSD fchown(2) fails
+       // in this case which seems to be POSIX compliant.  As there is
+       // nothing to do, skip the system call.
+       if (pair->dest_st.st_gid != pair->src_st.st_gid &&
+           fchown(pair->dest_fd, (uid_t)(-1), pair->src_st.st_gid)) {
                message_warning(_("%s: Cannot set the file group: %s"),
                                pair->dest_name, strerror(errno));
                // We can still safely copy some additional permissions: