svn commit: r363136 - head/usr.bin/xinstall
Eugene Grosbein
eugen at FreeBSD.org
Sun Jul 12 20:59:53 UTC 2020
Author: eugen
Date: Sun Jul 12 20:59:52 2020
New Revision: 363136
URL: https://svnweb.freebsd.org/changeset/base/363136
Log:
install(1): another correction after r363064
Make sure we call fsync(2) on strip result
in case of "safecopy" and "strip -o tempcopy -- src"
before renaming tempcopy to destination.
MFC after: 3 weeks
X-MFC-With: r363064
Modified:
head/usr.bin/xinstall/xinstall.c
Modified: head/usr.bin/xinstall/xinstall.c
==============================================================================
--- head/usr.bin/xinstall/xinstall.c Sun Jul 12 19:39:56 2020 (r363135)
+++ head/usr.bin/xinstall/xinstall.c Sun Jul 12 20:59:52 2020 (r363136)
@@ -147,7 +147,7 @@ static void install_dir(char *);
static void metadata_log(const char *, const char *, struct timespec *,
const char *, const char *, off_t);
static int parseid(const char *, id_t *);
-static int strip(const char *, const char *, char **);
+static int strip(const char *, int, const char *, char **);
static int trymmap(int);
static void usage(void);
@@ -862,7 +862,7 @@ install(const char *from_name, const char *to_name, u_
if (!devnull) {
if (dostrip)
stripped = strip(tempcopy ? tempfile : to_name,
- from_name, &digestresult);
+ to_fd, from_name, &digestresult);
if (!stripped)
digestresult = copy(from_fd, from_name, to_fd,
tempcopy ? tempfile : to_name, from_sb.st_size);
@@ -871,8 +871,8 @@ install(const char *from_name, const char *to_name, u_
if (dostrip) {
if (!stripped)
- (void)strip(tempcopy ? tempfile : to_name, NULL,
- &digestresult);
+ (void)strip(tempcopy ? tempfile : to_name, to_fd,
+ NULL, &digestresult);
/*
* Re-open our fd on the target, in case
@@ -1310,17 +1310,18 @@ copy(int from_fd, const char *from_name, int to_fd, co
/*
* strip --
* Use strip(1) to strip the target file.
- * Just invoke strip(1) on to_name if from_name is NULL,
- * else try to run "strip -o to_name -- from_name" and return 0 on failure.
- * Return 1 on success and assign result of digest_file(to_name) to *dresp.
+ * Just invoke strip(1) on to_name if from_name is NULL, else try
+ * to run "strip -o to_name -- from_name" and return 0 on failure.
+ * Return 1 on success and assign result of digest_file(to_name)
+ * to *dresp.
*/
static int
-strip(const char *to_name, const char *from_name, char **dresp)
+strip(const char *to_name, int to_fd, const char *from_name, char **dresp)
{
const char *stripbin;
const char *args[6];
pid_t pid;
- int error, status;
+ int error, serrno, status;
stripbin = getenv("STRIPBIN");
if (stripbin == NULL)
@@ -1355,6 +1356,12 @@ strip(const char *to_name, const char *from_name, char
(void)unlink(to_name);
errx(EX_SOFTWARE, "strip command %s failed on %s",
stripbin, to_name);
+ }
+ if (from_name != NULL && safecopy && fsync(to_fd) == -1) {
+ serrno = errno;
+ (void)unlink(to_name);
+ errno = serrno;
+ err(EX_OSERR, "fsync failed for %s", to_name);
}
if (dresp != NULL)
*dresp = digest_file(to_name);
More information about the svn-src-head
mailing list