Extend amount of possible coredumps from 10 to 100000 when using index format.

The amount of digits in the name of corefile is assigned dynamically.

Reviewed by:	kib
Differential Revision:	https://reviews.freebsd.org/D16118
This commit is contained in:
Mariusz Zaborski 2018-07-15 17:10:12 +00:00
parent 7d6f6a3532
commit f1fe1e020f

View File

@ -3214,11 +3214,7 @@ childproc_exited(struct proc *p)
sigparent(p, reason, status);
}
/*
* We only have 1 character for the core count in the format
* string, so the range will be 0-9
*/
#define MAX_NUM_CORE_FILES 10
#define MAX_NUM_CORE_FILES 100000
#ifndef NUM_CORE_FILES
#define NUM_CORE_FILES 5
#endif
@ -3311,18 +3307,19 @@ vnode_close_locked(struct thread *td, struct vnode *vp)
/*
* If the core format has a %I in it, then we need to check
* for existing corefiles before defining a name.
* To do this we iterate over 0..num_cores to find a
* To do this we iterate over 0..ncores to find a
* non-existing core file name to use. If all core files are
* already used we choose the oldest one.
*/
static int
corefile_open_last(struct thread *td, char *name, int indexpos,
struct vnode **vpp)
int indexlen, int ncores, struct vnode **vpp)
{
struct vnode *oldvp, *nextvp, *vp;
struct vattr vattr;
struct nameidata nd;
int error, i, flags, oflags, cmode;
char ch;
struct timespec lasttime;
nextvp = oldvp = NULL;
@ -3330,9 +3327,13 @@ corefile_open_last(struct thread *td, char *name, int indexpos,
oflags = VN_OPEN_NOAUDIT | VN_OPEN_NAMECACHE |
(capmode_coredump ? VN_OPEN_NOCAPCHECK : 0);
for (i = 0; i < num_cores; i++) {
for (i = 0; i < ncores; i++) {
flags = O_CREAT | FWRITE | O_NOFOLLOW;
name[indexpos] = '0' + i;
ch = name[indexpos + indexlen];
(void)snprintf(name + indexpos, indexlen + 1, "%.*u", indexlen,
i);
name[indexpos + indexlen] = ch;
NDINIT(&nd, LOOKUP, NOFOLLOW, UIO_SYSSPACE, name, td);
error = vn_open_cred(&nd, &flags, cmode, oflags, td->td_ucred,
@ -3402,12 +3403,14 @@ corefile_open(const char *comm, uid_t uid, pid_t pid, struct thread *td,
struct nameidata nd;
const char *format;
char *hostname, *name;
int cmode, error, flags, i, indexpos, oflags;
int cmode, error, flags, i, indexpos, indexlen, oflags, ncores;
hostname = NULL;
format = corefilename;
name = malloc(MAXPATHLEN, M_TEMP, M_WAITOK | M_ZERO);
indexlen = 0;
indexpos = -1;
ncores = num_cores;
(void)sbuf_new(&sb, name, MAXPATHLEN, SBUF_FIXEDLEN);
sx_slock(&corefilename_lock);
for (i = 0; format[i] != '\0'; i++) {
@ -3428,8 +3431,14 @@ corefile_open(const char *comm, uid_t uid, pid_t pid, struct thread *td,
sbuf_printf(&sb, "%s", hostname);
break;
case 'I': /* autoincrementing index */
sbuf_printf(&sb, "0");
indexpos = sbuf_len(&sb) - 1;
if (indexpos != -1) {
sbuf_printf(&sb, "%%I");
break;
}
indexpos = sbuf_len(&sb);
sbuf_printf(&sb, "%u", ncores - 1);
indexlen = sbuf_len(&sb) - indexpos;
break;
case 'N': /* process name */
sbuf_printf(&sb, "%s", comm);
@ -3469,7 +3478,8 @@ corefile_open(const char *comm, uid_t uid, pid_t pid, struct thread *td,
sbuf_delete(&sb);
if (indexpos != -1) {
error = corefile_open_last(td, name, indexpos, vpp);
error = corefile_open_last(td, name, indexpos, indexlen, ncores,
vpp);
if (error != 0) {
log(LOG_ERR,
"pid %d (%s), uid (%u): Path `%s' failed "