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);

Reply via email to