Index: sbin/savecore/savecore.c =================================================================== --- sbin/savecore/savecore.c +++ sbin/savecore/savecore.c @@ -973,7 +973,45 @@ close(fddev); } +/* Prepend "/dev/" to any arguments that don't already have it */ static char ** +devify(int argc, char **argv) +{ + char **devs; + int i, l; + + devs = malloc(argc * sizeof(*argv)); + if (devs == NULL) { + logmsg(LOG_ERR, "malloc(): %m"); + exit(1); + } + for (i = 0; i < argc; i++) { + if (strncmp(argv[i], _PATH_DEV, sizeof(_PATH_DEV) - 1) == 0) + devs[i] = strdup(argv[i]); + else { + char *fullpath; + + fullpath = malloc(PATH_MAX); + if (fullpath == NULL) { + logmsg(LOG_ERR, "malloc(): %m"); + exit(1); + } + l = snprintf(fullpath, PATH_MAX, "%s%s", _PATH_DEV, + argv[i]); + if (l < 0) { + logmsg(LOG_ERR, "snprintf(): %m"); + exit(1); + } if (l >= PATH_MAX) { + logmsg(LOG_ERR, "device name too long"); + exit(1); + } + devs[i] = fullpath; + } + } + return (devs); +} + +static char ** enum_dumpdevs(int *argcp) { struct fstab *fsp; @@ -1069,6 +1107,7 @@ { cap_rights_t rights; const char *savedir; + char **devs; int i, ch, error, savedirfd; checkfor = compress = clear = force = keep = verbose = 0; @@ -1132,7 +1171,10 @@ argv++; } if (argc == 0) - argv = enum_dumpdevs(&argc); + devs = enum_dumpdevs(&argc); + else { + devs = devify(argc, argv); + } savedirfd = open(savedir, O_RDONLY | O_DIRECTORY); if (savedirfd < 0) { @@ -1148,10 +1190,10 @@ } /* Enter capability mode. */ - init_caps(argc, argv); + init_caps(argc, devs); for (i = 0; i < argc; i++) - DoFile(savedir, savedirfd, argv[i]); + DoFile(savedir, savedirfd, devs[i]); /* Emit minimal output. */ if (nfound == 0) { Index: share/man/man5/rc.conf.5 =================================================================== --- share/man/man5/rc.conf.5 +++ share/man/man5/rc.conf.5 @@ -24,7 +24,7 @@ .\" .\" $FreeBSD$ .\" -.Dd June 23, 2020 +.Dd June 28, 2020 .Dt RC.CONF 5 .Os .Sh NAME @@ -3469,7 +3469,9 @@ .Pa /etc/fstab will be used as dump device. Otherwise, the value of this variable is passed as the argument to -.Xr dumpon 8 . +.Xr dumpon 8 +and +.Xr savecore 8 . To disable crash dumps, set this variable to .Dq Li NO . .It Va dumpon_flags