diff options
author | 2019-02-14 11:51:42 +0000 | |
---|---|---|
committer | 2019-02-14 11:51:42 +0000 | |
commit | 12d12f751fcceb9ba2770a0f5f097e7f60c99f14 (patch) | |
tree | c3fc259ab8ba75d66c86699c789323cd6301fb96 | |
parent | recommit ingo's 1.68 fix, now that we got a fix for the fringe case (diff) | |
download | wireguard-openbsd-12d12f751fcceb9ba2770a0f5f097e7f60c99f14.tar.xz wireguard-openbsd-12d12f751fcceb9ba2770a0f5f097e7f60c99f14.zip |
properly track file names and fds in case the installed file was already
there, so that mode-changing operations still work.
This fixes affected ports.
work by tedu@ and I, okay tedu@
-rw-r--r-- | usr.bin/xinstall/xinstall.c | 23 |
1 files changed, 15 insertions, 8 deletions
diff --git a/usr.bin/xinstall/xinstall.c b/usr.bin/xinstall/xinstall.c index dcd09c6902a..c4cec097387 100644 --- a/usr.bin/xinstall/xinstall.c +++ b/usr.bin/xinstall/xinstall.c @@ -1,4 +1,4 @@ -/* $OpenBSD: xinstall.c,v 1.70 2019/02/14 11:50:00 espie Exp $ */ +/* $OpenBSD: xinstall.c,v 1.71 2019/02/14 11:51:42 espie Exp $ */ /* $NetBSD: xinstall.c,v 1.9 1995/12/20 10:25:17 jonathan Exp $ */ /* @@ -222,6 +222,7 @@ install(char *from_name, char *to_name, u_long fset, u_int flags) struct timespec ts[2]; int devnull, from_fd, to_fd, serrno, files_match = 0; char *p; + char *target_name = tempfile; (void)memset((void *)&from_sb, 0, sizeof(from_sb)); (void)memset((void *)&to_sb, 0, sizeof(to_sb)); @@ -311,10 +312,14 @@ install(char *from_name, char *to_name, u_long fset, u_int flags) } else { files_match = 1; (void)unlink(tempfile); + target_name = to_name; + (void)close(temp_fd); } } - (void)close(to_fd); - to_fd = temp_fd; + if (!files_match) { + (void)close(to_fd); + to_fd = temp_fd; + } } /* @@ -333,13 +338,15 @@ install(char *from_name, char *to_name, u_long fset, u_int flags) if ((gid != (gid_t)-1 || uid != (uid_t)-1) && fchown(to_fd, uid, gid)) { serrno = errno; - (void)unlink(tempfile); - errx(1, "%s: chown/chgrp: %s", tempfile, strerror(serrno)); + if (target_name == tempfile) + (void)unlink(target_name); + errx(1, "%s: chown/chgrp: %s", target_name, strerror(serrno)); } if (fchmod(to_fd, mode)) { serrno = errno; - (void)unlink(tempfile); - errx(1, "%s: chmod: %s", tempfile, strerror(serrno)); + if (target_name == tempfile) + (void)unlink(target_name); + errx(1, "%s: chmod: %s", target_name, strerror(serrno)); } /* @@ -349,7 +356,7 @@ install(char *from_name, char *to_name, u_long fset, u_int flags) if (fchflags(to_fd, flags & SETFLAGS ? fset : from_sb.st_flags & ~UF_NODUMP)) { if (errno != EOPNOTSUPP || (from_sb.st_flags & ~UF_NODUMP) != 0) - warnx("%s: chflags: %s", tempfile, strerror(errno)); + warnx("%s: chflags: %s", target_name, strerror(errno)); } if (flags & USEFSYNC) |