svn commit: r334968 - head/sbin/dump

Diane Bruce db at FreeBSD.org
Mon Jun 11 19:12:51 UTC 2018


Author: db (ports committer)
Date: Mon Jun 11 19:12:50 2018
New Revision: 334968
URL: https://svnweb.freebsd.org/changeset/base/334968

Log:
  Large file systems with inodes > 512K have been silently overflowing
  c_addr in spcl. So check before we start dumping otherwise we can
  end up with a corrupted dump.
  
  PR:		228807
  Submitted by:	db
  Reviewed by:	imp
  Approved by:	imp

Modified:
  head/sbin/dump/main.c   (contents, props changed)

Modified: head/sbin/dump/main.c
==============================================================================
--- head/sbin/dump/main.c	Mon Jun 11 19:03:49 2018	(r334967)
+++ head/sbin/dump/main.c	Mon Jun 11 19:12:50 2018	(r334968)
@@ -103,6 +103,7 @@ main(int argc, char *argv[])
 	int i, ret, anydirskipped, bflag = 0, Tflag = 0, honorlevel = 1;
 	int just_estimate = 0;
 	ino_t maxino;
+	int c_count=0;
 	char *tmsg;
 
 	spcl.c_date = _time_to_time64(time(NULL));
@@ -433,7 +434,6 @@ main(int argc, char *argv[])
 		msgtail("to %s\n", tape);
 
 	sync();
-	sblock = NULL;
 	if ((ret = sbget(diskfd, &sblock, -1)) != 0) {
 		switch (ret) {
 		case ENOENT:
@@ -453,6 +453,9 @@ main(int argc, char *argv[])
 		quit("TP_BSIZE (%d) is not a power of 2", TP_BSIZE);
 	maxino = sblock->fs_ipg * sblock->fs_ncg;
 	mapsize = roundup(howmany(maxino, CHAR_BIT), TP_BSIZE);
+	c_count = howmany(mapsize * sizeof(char), TP_BSIZE);
+	if (c_count > TP_NINDIR)
+		quit("fs is too large for dump!");
 	usedinomap = (char *)calloc((unsigned) mapsize, sizeof(char));
 	dumpdirmap = (char *)calloc((unsigned) mapsize, sizeof(char));
 	dumpinomap = (char *)calloc((unsigned) mapsize, sizeof(char));


More information about the svn-src-head mailing list