sync with OpenBSD -current

This commit is contained in:
purplerain 2024-01-18 08:29:14 +00:00
parent ee68147dcd
commit 1cefe29c7e
Signed by: purplerain
GPG key ID: F42C07F07E2E35B7
1651 changed files with 283292 additions and 68089 deletions

View file

@ -1,4 +1,4 @@
/* $OpenBSD: exec_elf.c,v 1.184 2024/01/16 19:05:01 deraadt Exp $ */
/* $OpenBSD: exec_elf.c,v 1.185 2024/01/17 22:22:25 kurt Exp $ */
/*
* Copyright (c) 1996 Per Fogelstrom
@ -1154,7 +1154,7 @@ coredump_elf(struct proc *p, void *cookie)
goto out;
error = coredump_write(cookie, UIO_SYSSPACE, ws.psections,
ws.psectionslen);
ws.psectionslen, 0);
if (error)
goto out;
@ -1193,10 +1193,11 @@ coredump_elf(struct proc *p, void *cookie)
if (pent->p_vaddr == p->p_p->ps_sigcode &&
pent->p_filesz == sigcode_sz) {
error = coredump_write(cookie, UIO_SYSSPACE,
(void *)sigcode_va, sigcode_sz);
(void *)sigcode_va, sigcode_sz, 0);
} else {
error = coredump_write(cookie, UIO_USERSPACE,
(void *)(vaddr_t)pent->p_vaddr, pent->p_filesz);
(void *)(vaddr_t)pent->p_vaddr, pent->p_filesz,
(pent->p_flags & PF_ISVNODE));
}
if (error)
goto out;
@ -1298,7 +1299,7 @@ coredump_setup_elf(int segment_count, void *cookie)
}
/* Write out the ELF header. */
error = coredump_write(ws->iocookie, UIO_SYSSPACE, &ehdr, sizeof(ehdr));
error = coredump_write(ws->iocookie, UIO_SYSSPACE, &ehdr, sizeof(ehdr), 0);
if (error)
return error;
@ -1309,11 +1310,11 @@ coredump_setup_elf(int segment_count, void *cookie)
if (ehdr.e_shnum != 0) {
Elf_Shdr shdr = { .sh_info = ws->npsections };
error = coredump_write(ws->iocookie, UIO_SYSSPACE, &shdr,
sizeof shdr);
sizeof shdr, 0);
if (error)
return error;
error = coredump_write(ws->iocookie, UIO_SYSSPACE, &shstrtab,
sizeof(shstrtab.shdr) + sizeof(shstrtab.shstrtab));
sizeof(shstrtab.shdr) + sizeof(shstrtab.shstrtab), 0);
if (error)
return error;
}
@ -1348,7 +1349,7 @@ coredump_setup_elf(int segment_count, void *cookie)
int
coredump_walk_elf(vaddr_t start, vaddr_t realend, vaddr_t end, vm_prot_t prot,
int nsegment, void *cookie)
int isvnode, int nsegment, void *cookie)
{
struct writesegs_state *ws = cookie;
Elf_Phdr phdr;
@ -1370,6 +1371,8 @@ coredump_walk_elf(vaddr_t start, vaddr_t realend, vaddr_t end, vm_prot_t prot,
phdr.p_flags |= PF_W;
if (prot & PROT_EXEC)
phdr.p_flags |= PF_X;
if (isvnode)
phdr.p_flags |= PF_ISVNODE;
phdr.p_align = PAGE_SIZE;
ws->secoff += phdr.p_filesz;
@ -1446,17 +1449,17 @@ coredump_notes_elf(struct proc *p, void *iocookie, size_t *sizep)
nhdr.type = NT_OPENBSD_AUXV;
error = coredump_write(iocookie, UIO_SYSSPACE,
&nhdr, sizeof(nhdr));
&nhdr, sizeof(nhdr), 0);
if (error)
return (error);
error = coredump_write(iocookie, UIO_SYSSPACE,
"OpenBSD", elfround(nhdr.namesz));
"OpenBSD", elfround(nhdr.namesz), 0);
if (error)
return (error);
error = coredump_write(iocookie, UIO_USERSPACE,
(caddr_t)pr->ps_auxinfo, nhdr.descsz);
(caddr_t)pr->ps_auxinfo, nhdr.descsz, 0);
if (error)
return (error);
}
@ -1596,15 +1599,15 @@ coredump_writenote_elf(struct proc *p, void *cookie, Elf_Note *nhdr,
{
int error;
error = coredump_write(cookie, UIO_SYSSPACE, nhdr, sizeof(*nhdr));
error = coredump_write(cookie, UIO_SYSSPACE, nhdr, sizeof(*nhdr), 0);
if (error)
return error;
error = coredump_write(cookie, UIO_SYSSPACE, name,
elfround(nhdr->namesz));
elfround(nhdr->namesz), 0);
if (error)
return error;
return coredump_write(cookie, UIO_SYSSPACE, data, nhdr->descsz);
return coredump_write(cookie, UIO_SYSSPACE, data, nhdr->descsz, 0);
}
#endif /* !SMALL_KERNEL */

View file

@ -1,4 +1,4 @@
/* $OpenBSD: kern_exec.c,v 1.253 2024/01/16 19:05:01 deraadt Exp $ */
/* $OpenBSD: kern_exec.c,v 1.254 2024/01/17 18:56:13 deraadt Exp $ */
/* $NetBSD: kern_exec.c,v 1.75 1996/02/09 18:59:28 christos Exp $ */
/*-
@ -268,21 +268,11 @@ sys_execve(struct proc *p, void *v, register_t *retval)
#ifdef MACHINE_STACK_GROWS_UP
size_t slen;
#endif
vaddr_t pc = PROC_PC(p);
char *stack;
struct ps_strings arginfo;
struct vmspace *vm = p->p_vmspace;
struct vnode *otvp;
if (vm->vm_execve &&
(pc >= vm->vm_execve_end || pc < vm->vm_execve)) {
printf("%s(%d): execve %lx outside %lx-%lx\n", pr->ps_comm,
pr->ps_pid, pc, vm->vm_execve, vm->vm_execve_end);
p->p_p->ps_acflag |= AEXECVE;
sigabort(p);
return (0);
}
/*
* Get other threads to stop, if contested return ERESTART,
* so the syscall is restarted after halting in userret.

View file

@ -1,4 +1,4 @@
/* $OpenBSD: kern_sig.c,v 1.320 2023/10/06 08:58:13 claudio Exp $ */
/* $OpenBSD: kern_sig.c,v 1.321 2024/01/17 22:22:25 kurt Exp $ */
/* $NetBSD: kern_sig.c,v 1.54 1996/04/22 01:38:32 christos Exp $ */
/*
@ -1745,7 +1745,8 @@ out:
#ifndef SMALL_KERNEL
int
coredump_write(void *cookie, enum uio_seg segflg, const void *data, size_t len)
coredump_write(void *cookie, enum uio_seg segflg, const void *data, size_t len,
int isvnode)
{
struct coredump_iostate *io = cookie;
off_t coffset = 0;
@ -1766,7 +1767,7 @@ coredump_write(void *cookie, enum uio_seg segflg, const void *data, size_t len)
(caddr_t)data + coffset, chunk,
io->io_offset + coffset, segflg,
IO_UNIT, io->io_cred, NULL, io->io_proc);
if (error) {
if (error && (error != EFAULT || !isvnode)) {
struct process *pr = io->io_proc->p_p;
if (error == ENOSPC)