Skip site navigation (1)Skip section navigation (2)
Date:      Wed, 10 Aug 2016 18:19:11 +0000 (UTC)
From:      Bryan Drewery <bdrewery@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r303932 - head/usr.bin/xinstall
Message-ID:  <201608101819.u7AIJBvU079498@repo.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: bdrewery
Date: Wed Aug 10 18:19:11 2016
New Revision: 303932
URL: https://svnweb.freebsd.org/changeset/base/303932

Log:
  Fix -b failure not restoring flags on the destination file.
  
  MFC after:	1 week
  Sponsored by:	EMC / Isilon Storage Division

Modified:
  head/usr.bin/xinstall/xinstall.c

Modified: head/usr.bin/xinstall/xinstall.c
==============================================================================
--- head/usr.bin/xinstall/xinstall.c	Wed Aug 10 18:19:08 2016	(r303931)
+++ head/usr.bin/xinstall/xinstall.c	Wed Aug 10 18:19:11 2016	(r303932)
@@ -904,6 +904,8 @@ install(const char *from_name, const cha
 				(void)printf("install: %s -> %s\n", to_name, backup);
 			if (unlink(backup) < 0 && errno != ENOENT) {
 				serrno = errno;
+				if (to_sb.st_flags & NOCHANGEBITS)
+					(void)chflags(to_name, to_sb.st_flags);
 				unlink(tempfile);
 				errno = serrno;
 				err(EX_OSERR, "unlink: %s", backup);
@@ -911,6 +913,8 @@ install(const char *from_name, const cha
 			if (link(to_name, backup) < 0) {
 				serrno = errno;
 				unlink(tempfile);
+				if (to_sb.st_flags & NOCHANGEBITS)
+					(void)chflags(to_name, to_sb.st_flags);
 				errno = serrno;
 				err(EX_OSERR, "link: %s to %s", to_name,
 				     backup);
@@ -1133,16 +1137,26 @@ create_newfile(const char *path, int tar
 
 		if (dobackup) {
 			if ((size_t)snprintf(backup, MAXPATHLEN, "%s%s",
-			    path, suffix) != strlen(path) + strlen(suffix))
+			    path, suffix) != strlen(path) + strlen(suffix)) {
+				saved_errno = errno;
+				if (sbp->st_flags & NOCHANGEBITS)
+					(void)chflags(path, sbp->st_flags);
+				errno = saved_errno;
 				errx(EX_OSERR, "%s: backup filename too long",
 				    path);
+			}
 			(void)snprintf(backup, MAXPATHLEN, "%s%s",
 			    path, suffix);
 			if (verbose)
 				(void)printf("install: %s -> %s\n",
 				    path, backup);
-			if (rename(path, backup) < 0)
+			if (rename(path, backup) < 0) {
+				saved_errno = errno;
+				if (sbp->st_flags & NOCHANGEBITS)
+					(void)chflags(path, sbp->st_flags);
+				errno = saved_errno;
 				err(EX_OSERR, "rename: %s to %s", path, backup);
+			}
 		} else
 			if (unlink(path) < 0)
 				saved_errno = errno;



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201608101819.u7AIJBvU079498>