aboutsummaryrefslogtreecommitdiff
path: root/sbin/savecore
diff options
context:
space:
mode:
authorEnji Cooper <ngie@FreeBSD.org>2017-04-14 19:41:48 +0000
committerEnji Cooper <ngie@FreeBSD.org>2017-04-14 19:41:48 +0000
commitf09cb4f208438216b8044b5b2f63e82b08831f42 (patch)
tree92ea5f598ab41029f425d0ef9c01122423fbad1a /sbin/savecore
parent7f77a37048ff977e0df514b002399f0c2362939c (diff)
Notes
Diffstat (limited to 'sbin/savecore')
-rw-r--r--sbin/savecore/savecore.c35
1 files changed, 27 insertions, 8 deletions
diff --git a/sbin/savecore/savecore.c b/sbin/savecore/savecore.c
index f1bfc03ab4a9..b11535e0531c 100644
--- a/sbin/savecore/savecore.c
+++ b/sbin/savecore/savecore.c
@@ -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>
@@ -278,7 +279,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];
@@ -294,19 +295,37 @@ check_space(const char *savedir, off_t dumpsize, int bounds)
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 "
+ "%jdKiB for dump; %jdKiB available; %jdKiB reserved)",
+ (intmax_t)needed,
+ (intmax_t)available + minfree,
+ (intmax_t)minfree);
return (0);
}
if (spacefree - needed < 0)