bin/50949: BUG: mtree doesn't honor the -P when checking/changing ownership

Rene de Vries rene at tunix.nl
Mon Apr 14 08:50:04 PDT 2003


>Number:         50949
>Category:       bin
>Synopsis:       BUG: mtree doesn't honor the -P when checking/changing ownership
>Confidential:   no
>Severity:       non-critical
>Priority:       medium
>Responsible:    freebsd-bugs
>State:          open
>Quarter:        
>Keywords:       
>Date-Required:
>Class:          sw-bug
>Submitter-Id:   current-users
>Arrival-Date:   Mon Apr 14 08:50:01 PDT 2003
>Closed-Date:
>Last-Modified:
>Originator:     Rene de Vries
>Release:        FreeBSD 4.7-RELEASE-p3 i386/FreeBSD 5.0-20030401 i386
>Organization:
Tunix Internet Security & Training
>Environment:
>Description:
	Symlinks are not always taken into account when -P is used.
>How-To-Repeat:
>Fix:

Files:
	usr.sbin/mtree/compare.c
	usr.sbin/mtree/verify.c

Diff against FreeBSD 5 (current as of 01 Apr 2003):

Index: usr.sbin/mtree/compare.c
===================================================================
RCS file: /home/fbsd-cvsrepo/src/usr.sbin/mtree/compare.c,v
retrieving revision 1.25
diff -u -r1.25 compare.c
--- usr.sbin/mtree/compare.c	13 Mar 2003 23:35:30 -0000	1.25
+++ usr.sbin/mtree/compare.c	1 Apr 2003 14:34:12 -0000
@@ -63,6 +63,7 @@
 
 extern int uflag;
 extern int lineno;
+extern int ftsoptions;
 
 static const char *ftype(u_int);
 
@@ -127,11 +128,19 @@
 		(void)printf("%suser expected %lu found %lu",
 		    tab, (u_long)s->st_uid, (u_long)p->fts_statp->st_uid);
 		if (uflag)
-			if (chown(p->fts_accpath, s->st_uid, -1))
-				(void)printf(" not modified: %s\n",
-				    strerror(errno));
-			else
-				(void)printf(" modified\n");
+			if (ftsoptions & FTS_PHYSICAL) {
+				if (lchown(p->fts_accpath, s->st_uid, -1))
+					(void)printf(" not modified: %s\n",
+					    strerror(errno));
+				else
+					(void)printf(" modified\n");
+			} else {
+				if (chown(p->fts_accpath, s->st_uid, -1))
+					(void)printf(" not modified: %s\n",
+					    strerror(errno));
+				else
+					(void)printf(" modified\n");
+			}
 		else
 			(void)printf("\n");
 		tab = "\t";
@@ -141,11 +150,19 @@
 		(void)printf("%sgid expected %lu found %lu",
 		    tab, (u_long)s->st_gid, (u_long)p->fts_statp->st_gid);
 		if (uflag)
-			if (chown(p->fts_accpath, -1, s->st_gid))
-				(void)printf(" not modified: %s\n",
-				    strerror(errno));
-			else
-				(void)printf(" modified\n");
+			if (ftsoptions & FTS_PHYSICAL) {
+				if (lchown(p->fts_accpath, -1, s->st_gid))
+					(void)printf(" not modified: %s\n",
+					    strerror(errno));
+				else
+					(void)printf(" modified\n");
+			} else {
+				if (chown(p->fts_accpath, -1, s->st_gid))
+					(void)printf(" not modified: %s\n",
+					    strerror(errno));
+				else
+					(void)printf(" modified\n");
+			}
 		else
 			(void)printf("\n");
 		tab = "\t";
@@ -157,11 +174,19 @@
 		(void)printf("%spermissions expected %#o found %#o",
 		    tab, s->st_mode, p->fts_statp->st_mode & MBITS);
 		if (uflag)
-			if (chmod(p->fts_accpath, s->st_mode))
-				(void)printf(" not modified: %s\n",
-				    strerror(errno));
-			else
-				(void)printf(" modified\n");
+			if (ftsoptions & FTS_PHYSICAL) {
+				if (lchmod(p->fts_accpath, s->st_mode))
+					(void)printf(" not modified: %s\n",
+				    	strerror(errno));
+				else
+					(void)printf(" modified\n");
+			} else {
+				if (chmod(p->fts_accpath, s->st_mode))
+					(void)printf(" not modified: %s\n",
+				    	strerror(errno));
+				else
+					(void)printf(" modified\n");
+			}
 		else
 			(void)printf("\n");
 		tab = "\t";
Index: usr.sbin/mtree/verify.c
===================================================================
RCS file: /home/fbsd-cvsrepo/src/usr.sbin/mtree/verify.c,v
retrieving revision 1.18
diff -u -r1.18 verify.c
--- usr.sbin/mtree/verify.c	13 Mar 2003 23:35:30 -0000	1.18
+++ usr.sbin/mtree/verify.c	1 Apr 2003 14:34:12 -0000
@@ -226,19 +226,36 @@
 
 		if (!create)
 			continue;
-		if (chown(path, p->st_uid, p->st_gid)) {
-			(void)printf("%s: user/group/mode not modified: %s\n",
-			    path, strerror(errno));
-			(void)printf("%s: warning: file mode %snot set\n", path,
-			    (p->flags & F_FLAGS) ? "and file flags " : "");
-			continue;
+		if (ftsoptions & FTS_PHYSICAL) {
+			if (lchown(path, p->st_uid, p->st_gid)) {
+				(void)printf("%s: user/group/mode not modified: %s\n",
+					     path, strerror(errno));
+				(void)printf("%s: warning: file mode %snot set\n", path,
+					     (p->flags & F_FLAGS) ? "and file flags " : "");
+				continue;
+			}
+			if (lchmod(path, p->st_mode))
+				(void)printf("%s: permissions not set: %s\n",
+					     path, strerror(errno));
+			if ((p->flags & F_FLAGS) && p->st_flags &&
+					chflags(path, p->st_flags))
+				(void)printf("%s: file flags not set: %s\n",
+					     path, strerror(errno));
+		} else {
+			if (chown(path, p->st_uid, p->st_gid)) {
+				(void)printf("%s: user/group/mode not modified: %s\n",
+					     path, strerror(errno));
+				(void)printf("%s: warning: file mode %snot set\n", path,
+					     (p->flags & F_FLAGS) ? "and file flags " : "");
+				continue;
+			}
+			if (chmod(path, p->st_mode))
+				(void)printf("%s: permissions not set: %s\n",
+					     path, strerror(errno));
+			if ((p->flags & F_FLAGS) && p->st_flags &&
+					chflags(path, p->st_flags))
+				(void)printf("%s: file flags not set: %s\n",
+					     path, strerror(errno));
 		}
-		if (chmod(path, p->st_mode))
-			(void)printf("%s: permissions not set: %s\n",
-			    path, strerror(errno));
-		if ((p->flags & F_FLAGS) && p->st_flags &&
-		    chflags(path, p->st_flags))
-			(void)printf("%s: file flags not set: %s\n",
-			    path, strerror(errno));
 	}
 }


>Release-Note:
>Audit-Trail:
>Unformatted:


More information about the freebsd-bugs mailing list