Module Name: src Committed By: christos Date: Thu Mar 30 20:17:11 UTC 2017
Modified Files: src/sys/kern: core_elf32.c kern_proc.c src/sys/sys: proc.h Log Message: factor out getauxv code. To generate a diff of this commit: cvs rdiff -u -r1.53 -r1.54 src/sys/kern/core_elf32.c cvs rdiff -u -r1.205 -r1.206 src/sys/kern/kern_proc.c cvs rdiff -u -r1.339 -r1.340 src/sys/sys/proc.h Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/sys/kern/core_elf32.c diff -u src/sys/kern/core_elf32.c:1.53 src/sys/kern/core_elf32.c:1.54 --- src/sys/kern/core_elf32.c:1.53 Wed Mar 29 18:48:03 2017 +++ src/sys/kern/core_elf32.c Thu Mar 30 16:17:11 2017 @@ -1,4 +1,4 @@ -/* $NetBSD: core_elf32.c,v 1.53 2017/03/29 22:48:03 kamil Exp $ */ +/* $NetBSD: core_elf32.c,v 1.54 2017/03/30 20:17:11 christos Exp $ */ /* * Copyright (c) 2001 Wasabi Systems, Inc. @@ -40,7 +40,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(1, "$NetBSD: core_elf32.c,v 1.53 2017/03/29 22:48:03 kamil Exp $"); +__KERNEL_RCSID(1, "$NetBSD: core_elf32.c,v 1.54 2017/03/30 20:17:11 christos Exp $"); #ifdef _KERNEL_OPT #include "opt_coredump.h" @@ -403,30 +403,18 @@ coredump_note_procinfo(struct lwp *l, st static int coredump_note_auxv(struct lwp *l, struct note_state *ns) { - struct ps_strings pss; int error; - struct proc *p = l->l_proc; - void *uauxv, *kauxv; + size_t len; + void *kauxv; - if ((error = copyin_psstrings(p, &pss)) != 0) + if ((error = proc_getauxv(l->l_proc, &kauxv, &len)) != 0) return error; - if (pss.ps_envstr == NULL) - return EIO; - - size_t ptrsz = PROC_PTRSZ(p); - uauxv = (void *)((char *)pss.ps_envstr + (pss.ps_nenvstr + 1) * ptrsz); - size_t len = p->p_execsw->es_arglen; - - kauxv = kmem_alloc(len, KM_SLEEP); - error = copyin_proc(p, uauxv, kauxv, len); - if (error == 0) { - ELFNAMEEND(coredump_savenote)(ns, ELF_NOTE_NETBSD_CORE_AUXV, - ELF_NOTE_NETBSD_CORE_NAME, kauxv, len); - } + ELFNAMEEND(coredump_savenote)(ns, ELF_NOTE_NETBSD_CORE_AUXV, + ELF_NOTE_NETBSD_CORE_NAME, kauxv, len); kmem_free(kauxv, len); - return error; + return 0; } static int Index: src/sys/kern/kern_proc.c diff -u src/sys/kern/kern_proc.c:1.205 src/sys/kern/kern_proc.c:1.206 --- src/sys/kern/kern_proc.c:1.205 Sat Jan 28 11:43:59 2017 +++ src/sys/kern/kern_proc.c Thu Mar 30 16:17:11 2017 @@ -1,4 +1,4 @@ -/* $NetBSD: kern_proc.c,v 1.205 2017/01/28 16:43:59 christos Exp $ */ +/* $NetBSD: kern_proc.c,v 1.206 2017/03/30 20:17:11 christos Exp $ */ /*- * Copyright (c) 1999, 2006, 2007, 2008 The NetBSD Foundation, Inc. @@ -62,7 +62,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: kern_proc.c,v 1.205 2017/01/28 16:43:59 christos Exp $"); +__KERNEL_RCSID(0, "$NetBSD: kern_proc.c,v 1.206 2017/03/30 20:17:11 christos Exp $"); #ifdef _KERNEL_OPT #include "opt_kstack.h" @@ -2470,3 +2470,34 @@ out: return 0; #endif } + +int +proc_getauxv(struct proc *p, void **buf, size_t *len) +{ + struct ps_strings pss; + int error; + void *uauxv, *kauxv; + + if ((error = copyin_psstrings(p, &pss)) != 0) + return error; + + if (pss.ps_envstr == NULL) + return EIO; + + size_t ptrsz = PROC_PTRSZ(p); + uauxv = (void *)((char *)pss.ps_envstr + (pss.ps_nenvstr + 1) * ptrsz); + size_t size = p->p_execsw->es_arglen; + + kauxv = kmem_alloc(size, KM_SLEEP); + + error = copyin_proc(p, uauxv, kauxv, size); + if (error) { + kmem_free(kauxv, size); + return error; + } + + *buf = kauxv; + *len = size; + + return 0; +} Index: src/sys/sys/proc.h diff -u src/sys/sys/proc.h:1.339 src/sys/sys/proc.h:1.340 --- src/sys/sys/proc.h:1.339 Fri Mar 24 13:40:44 2017 +++ src/sys/sys/proc.h Thu Mar 30 16:17:11 2017 @@ -1,4 +1,4 @@ -/* $NetBSD: proc.h,v 1.339 2017/03/24 17:40:44 christos Exp $ */ +/* $NetBSD: proc.h,v 1.340 2017/03/30 20:17:11 christos Exp $ */ /*- * Copyright (c) 2006, 2007, 2008 The NetBSD Foundation, Inc. @@ -543,6 +543,7 @@ int proc_uidmatch(kauth_cred_t, kauth_cr int proc_vmspace_getref(struct proc *, struct vmspace **); void proc_crmod_leave(kauth_cred_t, kauth_cred_t, bool); void proc_crmod_enter(void); +int proc_getauxv(struct proc *, void **, size_t *); int proc_specific_key_create(specificdata_key_t *, specificdata_dtor_t); void proc_specific_key_delete(specificdata_key_t);