Also use syslog's %m format instead of %s + strerror(). We can't use devname() because the database file may be out of date and savecore runs early in the boot sequence.
- todd Index: sbin/savecore/savecore.c =================================================================== RCS file: /cvs/src/sbin/savecore/savecore.c,v retrieving revision 1.57 diff -u -p -u -r1.57 savecore.c --- sbin/savecore/savecore.c 1 Sep 2016 14:12:07 -0000 1.57 +++ sbin/savecore/savecore.c 12 Jun 2017 21:23:05 -0000 @@ -281,7 +281,7 @@ kmem_setup(void) } hdrsz = kvm_dump_mkheader(kd_dump, dumpoff); if (hdrsz == -1) { - if(verbose) + if (verbose) syslog(LOG_ERR, "%s: kvm_dump_mkheader: %s", dump_sys, kvm_geterr(kd_dump)); syslog(LOG_WARNING, "no core dump"); @@ -394,7 +394,7 @@ save_core(void) goto err1; if (fgets(buf, sizeof(buf), fp) == NULL) { if (ferror(fp)) -err1: syslog(LOG_WARNING, "%s: %s", path, strerror(errno)); +err1: syslog(LOG_WARNING, "%s: %m", path); bounds = 0; } else { const char *errstr = NULL; @@ -420,7 +420,7 @@ err1: syslog(LOG_WARNING, "%s: %s", pa dirn, _PATH_UNIX, bounds, zcompress ? ".Z" : ""); if (zcompress) { if ((fp = zopen(path, "w", 0)) == NULL) { - syslog(LOG_ERR, "%s: %s", path, strerror(errno)); + syslog(LOG_ERR, "%s: %m", path); exit(1); } } else { @@ -433,7 +433,7 @@ err1: syslog(LOG_WARNING, "%s: %s", pa fp = fdopen(ofd, "w"); if (fp == NULL) { - syslog(LOG_ERR, "%s: fdopen: %s", path, strerror(errno)); + syslog(LOG_ERR, "%s: fdopen: %m", path); exit(1); } } @@ -495,7 +495,7 @@ err2: syslog(LOG_WARNING, dirn, _PATH_UNIX, bounds, zcompress ? ".Z" : ""); if (zcompress) { if ((fp = zopen(path, "w", 0)) == NULL) { - syslog(LOG_ERR, "%s: %s", path, strerror(errno)); + syslog(LOG_ERR, "%s: %m", path); exit(1); } } else { @@ -522,8 +522,7 @@ err2: syslog(LOG_WARNING, } } if (nr < 0) { - syslog(LOG_ERR, "%s: %s", - kernel ? kernel : _PATH_UNIX, strerror(errno)); + syslog(LOG_ERR, "%s: %m", kernel ? kernel : _PATH_UNIX); syslog(LOG_WARNING, "WARNING: kernel may be incomplete"); exit(1); @@ -541,30 +540,27 @@ find_dev(dev_t dev, int type) DIR *dfd; struct dirent *dir; struct stat sb; - char *dp, devname[PATH_MAX]; + char *dp; if ((dfd = opendir(_PATH_DEV)) == NULL) { - syslog(LOG_ERR, "%s: %s", _PATH_DEV, strerror(errno)); + syslog(LOG_ERR, "%s: %m", _PATH_DEV); exit(1); } - (void)strlcpy(devname, _PATH_DEV, sizeof devname); while ((dir = readdir(dfd))) { - (void)strlcpy(devname + sizeof(_PATH_DEV) - 1, dir->d_name, - sizeof devname - (sizeof(_PATH_DEV) - 1)); - if (lstat(devname, &sb)) { - syslog(LOG_ERR, "%s: %s", devname, strerror(errno)); + if (dir->d_type != DT_UNKNOWN && DTTOIF(dir->d_type) != type) + continue; + if (fstatat(dirfd(dfd), dir->d_name, &sb, AT_SYMLINK_NOFOLLOW)) { + syslog(LOG_ERR, "%s%s: %m", _PATH_DEV, dir->d_name); continue; } - if ((sb.st_mode & S_IFMT) != type) + if (dev != sb.st_rdev || (sb.st_mode & S_IFMT) != type) continue; - if (dev == sb.st_rdev) { - closedir(dfd); - if ((dp = strdup(devname)) == NULL) { - syslog(LOG_ERR, "%s", strerror(errno)); - exit(1); - } - return (dp); + if (asprintf(&dp, "%s%s", _PATH_DEV, dir->d_name) == -1) { + syslog(LOG_ERR, "%m"); + exit(1); } + closedir(dfd); + return (dp); } closedir(dfd); syslog(LOG_ERR, "can't find device %d/%d", major(dev), minor(dev)); @@ -583,7 +579,7 @@ rawname(char *s) } (void)snprintf(name, sizeof(name), "%.*s/r%s", (int)(sl - s), s, sl + 1); if ((sl = strdup(name)) == NULL) { - syslog(LOG_ERR, "%s", strerror(errno)); + syslog(LOG_ERR, "%m"); exit(1); } return (sl);