The following reply was made to PR bin/181636; it has been noted by GNATS.

From: Wim Lewis <[email protected]>
To: [email protected]
Cc:  
Subject: Re: bin/181636: mtree(8): mtree -U does not fix ownership of symbolic 
links
Date: Wed, 21 May 2014 18:03:13 -0700

 I've encountered this as well. I think the fix would be to change the =
 miss() function in verify.c to use lchown (and possibly =
 lchmod/lchflags?) instead of chown/chmod/chflags when p->type =3D=3D =
 F_LINK. It already uses lchown when *creating* the symlink, so this =
 would be a sensible symmetry. Something along the lines of the following =
 patch maybe:
 
 
 --- /usr/src/usr.sbin/mtree/verify.c   2012-12-03 13:22:44.000000000 =
 -0800
 +++ verify.c   2014-05-21 18:00:04.000000000 -0700
 @@ -155,6 +155,32 @@
        return (rval);
  }
 =20
 +
 +static void
 +pchown(NODE *p)
 +{
 +      if ((p->type =3D=3D F_LINK ? lchown : chown)(path, p->st_uid, =
 p->st_gid) =3D=3D -1) {
 +              serr =3D errno;
 +              if (p->st_uid =3D=3D (uid_t)-1)
 +                      what =3D "group";
 +              else if ((p->type =3D=3D F_LINK ? lchown : chown)(path, =
 (uid_t)-1, p->st_gid) =3D=3D -1)
 +                      what =3D "user & group";
 +              else {
 +                      what =3D "user";
 +                      errno =3D serr;
 +              }
 +              (void)printf("%s: %s not modified: %s"
 +                  "\n", path, what, strerror(errno));
 +      }
 +      if (p->type !=3D F_LINK && chmod(path, p->st_mode))
 +              (void)printf("%s: permissions not set: %s\n",
 +                  path, strerror(errno));
 +      if ((p->flags & F_FLAGS) && p->st_flags &&
 +          (p->type =3D=3D F_LINK ? lchflags : chflags)(path, =
 p->st_flags))
 +              (void)printf("%s: file flags not set: %s\n",
 +                  path, strerror(errno));
 +}
 +
  static void
  miss(NODE *p, char *tail)
  {
 @@ -200,20 +226,7 @@
                                            strerror(errno));
                                else
                                        (void)printf(" (created)\n");
 -                              if (lchown(path, p->st_uid, p->st_gid) =
 =3D=3D -1) {
 -                                      serr =3D errno;
 -                                      if (p->st_uid =3D=3D (uid_t)-1)
 -                                              what =3D "group";
 -                                      else if (lchown(path, (uid_t)-1,
 -                                          p->st_gid) =3D=3D -1)
 -                                              what =3D "user & group";
 -                                      else {
 -                                              what =3D "user";
 -                                              errno =3D serr;
 -                                      }
 -                                      (void)printf("%s: %s not =
 modified: %s"
 -                                          "\n", path, what, =
 strerror(errno));
 -                              }
 +                              pchown(p);
                                continue;
                        } else if (!(p->flags & F_MODE))
                            (void)printf(" (directory not created: mode =
 not specified)");
 @@ -235,25 +248,6 @@
 =20
                if (!create)
                        continue;
 -              if (chown(path, p->st_uid, p->st_gid) =3D=3D -1) {
 -                      serr =3D errno;
 -                      if (p->st_uid =3D=3D (uid_t)-1)
 -                              what =3D "group";
 -                      else if (chown(path, (uid_t)-1, p->st_gid) =3D=3D =
 -1)
 -                              what =3D "user & group";
 -                      else {
 -                              what =3D "user";
 -                              errno =3D serr;
 -                      }
 -                      (void)printf("%s: %s not modified: %s\n",
 -                          path, what, 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));
 +              pchown(p);
        }
  }
 
 
 
_______________________________________________
[email protected] mailing list
http://lists.freebsd.org/mailman/listinfo/freebsd-bugs
To unsubscribe, send any mail to "[email protected]"

Reply via email to