doc/share/security/patches/SA-04:01/mksnap_ffs_5_1.patch
Bjoern A. Zeeb 3571e53040 Import FreeBSD Security Advisories and Errata Notices, as well as their
patches for easier mirroring, to eliminate a special copy, to make
www.freebsd.org/security a full copy of security.freebsd.org and be
eventually be the same.

For now files are just sitting there.   The symlinks are missing.

Discussed on:	www (repository location)
Discussed with:	simon (so)
2012-08-15 06:19:40 +00:00

104 lines
2.9 KiB
Diff

Index: sbin/mksnap_ffs/mksnap_ffs.c
===================================================================
RCS file: /home/ncvs/src/sbin/mksnap_ffs/mksnap_ffs.c,v
retrieving revision 1.2
retrieving revision 1.2.2.1
diff -u -r1.2 -r1.2.2.1
--- sbin/mksnap_ffs/mksnap_ffs.c 2 Mar 2003 08:07:57 -0000 1.2
+++ sbin/mksnap_ffs/mksnap_ffs.c 27 Jan 2004 19:33:16 -0000 1.2.2.1
@@ -32,7 +32,7 @@
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*
- * $FreeBSD: src/sbin/mksnap_ffs/mksnap_ffs.c,v 1.2 2003/03/02 08:07:57 mckusick Exp $
+ * $FreeBSD: src/sbin/mksnap_ffs/mksnap_ffs.c,v 1.2.2.1 2004/01/27 19:33:16 des Exp $
*/
#include <sys/param.h>
@@ -43,24 +43,20 @@
#include <errno.h>
#include <fcntl.h>
#include <grp.h>
+#include <limits.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sysexits.h>
#include <unistd.h>
-void
-usage()
-{
-
- fprintf(stderr, "usage: mksnap_ffs mountpoint file\n");
- exit(EX_USAGE);
-}
+void usage(void);
int
main(int argc, char **argv)
{
- const char *dir;
+ char *dir, *cp, path[PATH_MAX];
+ struct statfs stfsbuf;
struct ufs_args args;
struct group *grp;
struct stat stbuf;
@@ -72,9 +68,43 @@
dir = argv[1];
args.fspec = argv[2];
+ /*
+ * Check that the user running this program has permission
+ * to create and remove a snapshot file from the directory
+ * in which they have requested to have it made. If the
+ * directory is sticky and not owned by the user, then they
+ * will not be able to remove the snapshot when they are
+ * done with it.
+ */
+ if (strlen(args.fspec) >= PATH_MAX)
+ errx(1, "pathname too long %s", args.fspec);
+ cp = strrchr(args.fspec, '/');
+ if (cp == NULL) {
+ strlcpy(path, ".", PATH_MAX);
+ } else if (cp == args.fspec) {
+ strlcpy(path, "/", PATH_MAX);
+ } else {
+ strlcpy(path, args.fspec, cp - args.fspec + 1);
+ }
+ if(statfs(path, &stfsbuf) < 0)
+ err(1, "%s", path);
+ if (stat(path, &stbuf) < 0)
+ err(1, "%s", path);
+ if (!S_ISDIR(stbuf.st_mode))
+ errx(1, "%s: Not a directory", path);
+ 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);
+
+ /*
+ * Having verified access to the directory in which the
+ * snapshot is to be built, proceed with creating it.
+ */
if ((grp = getgrnam("operator")) == NULL)
errx(1, "Cannot retrieve operator gid");
- if (mount("ffs", dir, MNT_UPDATE | MNT_SNAPSHOT, &args) < 0)
+ if (mount("ffs", dir, MNT_UPDATE | MNT_SNAPSHOT | stfsbuf.f_flags,
+ &args) < 0)
err(1, "Cannot create %s", args.fspec);
if ((fd = open(args.fspec, O_RDONLY)) < 0)
err(1, "Cannot open %s", args.fspec);
@@ -88,4 +118,12 @@
err(1, "Cannot chmod %s", args.fspec);
exit(EXIT_SUCCESS);
+}
+
+void
+usage()
+{
+
+ fprintf(stderr, "usage: mksnap_ffs mountpoint snapshot_name\n");
+ exit(EX_USAGE);
}