Skip site navigation (1)Skip section navigation (2)
Date:      Sun, 14 May 2017 10:48:47 +0000 (UTC)
From:      Maxim Sobolev <sobomax@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-stable@freebsd.org, svn-src-stable-11@freebsd.org
Subject:   svn commit: r318265 - stable/11/sbin/mksnap_ffs
Message-ID:  <201705141048.v4EAmlON077677@repo.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: sobomax
Date: Sun May 14 10:48:47 2017
New Revision: 318265
URL: https://svnweb.freebsd.org/changeset/base/318265

Log:
  MFC r316718, r316738: make mksnap_ffs functional in the chroot'ed environment.

Modified:
  stable/11/sbin/mksnap_ffs/mksnap_ffs.c
Directory Properties:
  stable/11/   (props changed)

Modified: stable/11/sbin/mksnap_ffs/mksnap_ffs.c
==============================================================================
--- stable/11/sbin/mksnap_ffs/mksnap_ffs.c	Sun May 14 10:15:04 2017	(r318264)
+++ stable/11/sbin/mksnap_ffs/mksnap_ffs.c	Sun May 14 10:48:47 2017	(r318265)
@@ -58,6 +58,33 @@ usage(void)
 	errx(EX_USAGE, "usage: mksnap_ffs snapshot_name");
 }
 
+static int
+isdir(const char *path, struct stat *stbufp)
+{
+
+	if (stat(path, stbufp) < 0)
+		return (-1);
+        if (!S_ISDIR(stbufp->st_mode))
+		return (0);
+	return (1);
+}
+
+static int
+issamefs(const char *path, struct statfs *stfsp)
+{
+	struct statfs stfsbuf;
+	struct stat stbuf;
+
+	if (isdir(path, &stbuf) != 1)
+		return (-1);
+	if (statfs(path, &stfsbuf) < 0)
+		return (-1);
+	if ((stfsbuf.f_fsid.val[0] != stfsp->f_fsid.val[0]) ||
+	    (stfsbuf.f_fsid.val[1] != stfsp->f_fsid.val[1]))
+		return (0);
+	return (1);
+}
+
 int
 main(int argc, char **argv)
 {
@@ -96,16 +123,33 @@ main(int argc, char **argv)
 	}
 	if (statfs(path, &stfsbuf) < 0)
 		err(1, "%s", path);
-	if (stat(path, &stbuf) < 0)
+	switch (isdir(path, &stbuf)) {
+	case -1:
 		err(1, "%s", path);
-	if (!S_ISDIR(stbuf.st_mode))
+	case 0:
 		errx(1, "%s: Not a directory", path);
+	default:
+		break;
+	}
 	if (access(path, W_OK) < 0)
 		err(1, "Lack write permission in %s", path);
 	if ((stbuf.st_mode & S_ISTXT) && stbuf.st_uid != getuid())
 		errx(1, "Lack write permission in %s: Sticky bit set", path);
 
 	/*
+	 * Work around an issue when mksnap_ffs is started in chroot'ed
+	 * environment and f_mntonname contains absolute path within
+	 * real root.
+	 */
+	for (cp = stfsbuf.f_mntonname; issamefs(cp, &stfsbuf) != 1;
+	    cp = strchrnul(cp + 1, '/')) {
+		if (cp[0] == '\0')
+			errx(1, "%s: Not a mount point", stfsbuf.f_mntonname);
+	}
+	if (cp != stfsbuf.f_mntonname)
+		strlcpy(stfsbuf.f_mntonname, cp, sizeof(stfsbuf.f_mntonname));
+
+	/*
 	 * Having verified access to the directory in which the
 	 * snapshot is to be built, proceed with creating it.
 	 */



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