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>