svn commit: r321212 - stable/10/sbin/savecore

Ngie Cooper ngie at FreeBSD.org
Wed Jul 19 16:38:56 UTC 2017


Author: ngie
Date: Wed Jul 19 16:38:55 2017
New Revision: 321212
URL: https://svnweb.freebsd.org/changeset/base/321212

Log:
  Relnotes:       yes (subtle output/behavior change)
  
  MFC r316938,r316953:
  
  r316938:
  
  savecore: fix space calculation with respect to `minfree` in check_space(..)
  
  - Use strtoll(3) instead of atoi(3), because atoi(3) limits the
    representable data to INT_MAX. Check the values received from
    strtoll(3), trimming trailing whitespace off the end to maintain
    POLA.
  - Use `KiB` instead of `kB` when describing free space, total space,
    etc. I am now fully aware of `KiB` being the IEC standard for 1024
    bytes and `kB` being the IEC standard for 1000 bytes.
  - Store available number of KiB in `available` so it can be more
    easily queried and compared to ensure that there are enough KiB to
    store the dump image on disk.
  - Print out the reserved space on disk, per `minfree`, so end-users
    can troubleshoot why check_space(..) is reporting that there isn't
    enough free space.
  
  Tested with:	positive/negative cases (see review); make tinderbox
  
  r316953:
  
  Switch back to non-IEC units for 1024 bytes
  
  I was swayed a little too quickly when I saw the wiki page discussing
  kB vs KiB. Switch back as none of the code in base openly uses
  IEC units via humanize_number(3) (which was my next step), and there's
  a large degree of dislike with IEC vs more SI-like units.

Modified:
  stable/10/sbin/savecore/savecore.c
Directory Properties:
  stable/10/   (props changed)

Modified: stable/10/sbin/savecore/savecore.c
==============================================================================
--- stable/10/sbin/savecore/savecore.c	Wed Jul 19 16:23:02 2017	(r321211)
+++ stable/10/sbin/savecore/savecore.c	Wed Jul 19 16:38:55 2017	(r321212)
@@ -68,6 +68,7 @@ __FBSDID("$FreeBSD$");
 #include <sys/kerneldump.h>
 #include <sys/mount.h>
 #include <sys/stat.h>
+#include <ctype.h>
 #include <errno.h>
 #include <fcntl.h>
 #include <fstab.h>
@@ -252,7 +253,7 @@ static int
 check_space(const char *savedir, off_t dumpsize, int bounds)
 {
 	FILE *fp;
-	off_t minfree, spacefree, totfree, needed;
+	off_t available, minfree, spacefree, totfree, needed;
 	struct statfs fsbuf;
 	char buf[100];
 
@@ -268,19 +269,37 @@ check_space(const char *savedir, off_t dumpsize, int b
 	else {
 		if (fgets(buf, sizeof(buf), fp) == NULL)
 			minfree = 0;
-		else
-			minfree = atoi(buf);
+		else {
+			char *endp;
+
+			errno = 0;
+			minfree = strtoll(buf, &endp, 10);
+			if (minfree == 0 && errno != 0)
+				minfree = -1;
+			else {
+				while (*endp != '\0' && isspace(*endp))
+					endp++;
+				if (*endp != '\0' || minfree < 0)
+					minfree = -1;
+			}
+			if (minfree < 0)
+				syslog(LOG_WARNING,
+				    "`minfree` didn't contain a valid size "
+				    "(`%s`). Defaulting to 0", buf);
+		}
 		(void)fclose(fp);
 	}
 
+	available = minfree > 0 ? spacefree - minfree : totfree;
 	needed = dumpsize / 1024 + 2;	/* 2 for info file */
 	needed -= saved_dump_size(bounds);
-	if ((minfree > 0 ? spacefree : totfree) - needed < minfree) {
+	if (available < needed) {
 		syslog(LOG_WARNING,
-		    "no dump: not enough free space on device (%lldkB "
-		    "available; need at least %lldkB)",
-		    (long long)(minfree > 0 ? spacefree : totfree),
-		    (long long)needed);
+		    "no dump: not enough free space on device (need at least "
+		    "%jdkB for dump; %jdkB available; %jdkB reserved)",
+		    (intmax_t)needed,
+		    (intmax_t)available + minfree,
+		    (intmax_t)minfree);
 		return (0);
 	}
 	if (spacefree - needed < 0)


More information about the svn-src-all mailing list