diff options
author | Rob Landley <rob@landley.net> | 2014-11-22 00:36:45 -0600 |
---|---|---|
committer | Rob Landley <rob@landley.net> | 2014-11-22 00:36:45 -0600 |
commit | f6c28b6e0017ac36190ee31132721a1c9e30f2b6 (patch) | |
tree | c242e6d66c112c46ec1a0010758ff00df29f2e87 /toys/posix/cp.c | |
parent | ea6fc27fc8853b317a78c402e290bdc0142792e8 (diff) | |
download | toybox-f6c28b6e0017ac36190ee31132721a1c9e30f2b6.tar.gz |
As long as Android's going to require fortify, fixup the warnings it generates.
Diffstat (limited to 'toys/posix/cp.c')
-rw-r--r-- | toys/posix/cp.c | 22 |
1 files changed, 15 insertions, 7 deletions
diff --git a/toys/posix/cp.c b/toys/posix/cp.c index 07a8f05b..9e83cb80 100644 --- a/toys/posix/cp.c +++ b/toys/posix/cp.c @@ -261,6 +261,7 @@ int cp_node(struct dirtree *try) if (fdout != -1) { if (flags & (FLAG_a|FLAG_p)) { struct timespec times[2]; + int rc; // Inability to set these isn't fatal, some require root access. @@ -268,13 +269,20 @@ int cp_node(struct dirtree *try) times[1] = try->st.st_mtim; // If we can't get a filehandle to the actual object, use racy functions - if (fdout == AT_FDCWD) { - fchownat(cfd, catch, try->st.st_uid, try->st.st_gid, - AT_SYMLINK_NOFOLLOW); - utimensat(cfd, catch, times, AT_SYMLINK_NOFOLLOW); - // permission bits already correct for mknod, don't apply to symlink - } else { - fchown(fdout, try->st.st_uid, try->st.st_gid); + if (fdout == AT_FDCWD) + rc = fchownat(cfd, catch, try->st.st_uid, try->st.st_gid, + AT_SYMLINK_NOFOLLOW); + else rc = fchown(fdout, try->st.st_uid, try->st.st_gid); + if (rc) { + char *pp; + + perror_msg("chown '%s'", pp = dirtree_path(try, 0)); + free(pp); + } + + // permission bits already correct for mknod and don't apply to symlink + if (fdout == AT_FDCWD) utimensat(cfd, catch, times, AT_SYMLINK_NOFOLLOW); + else { futimens(fdout, times); fchmod(fdout, try->st.st_mode); } |