Module Name: src Committed By: christos Date: Thu Sep 29 20:40:53 UTC 2016
Modified Files: src/sys/kern: core_elf32.c kern_proc.c sys_process.c src/sys/sys: proc.h Log Message: Introduce and use PROC_PTRSZ() to handle differing pointer size 64->32 emulation. To generate a diff of this commit: cvs rdiff -u -r1.48 -r1.49 src/sys/kern/core_elf32.c cvs rdiff -u -r1.197 -r1.198 src/sys/kern/kern_proc.c cvs rdiff -u -r1.169 -r1.170 src/sys/kern/sys_process.c cvs rdiff -u -r1.333 -r1.334 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.48 src/sys/kern/core_elf32.c:1.49 --- src/sys/kern/core_elf32.c:1.48 Mon Sep 5 13:42:57 2016 +++ src/sys/kern/core_elf32.c Thu Sep 29 16:40:53 2016 @@ -1,4 +1,4 @@ -/* $NetBSD: core_elf32.c,v 1.48 2016/09/05 17:42:57 dholland Exp $ */ +/* $NetBSD: core_elf32.c,v 1.49 2016/09/29 20:40:53 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.48 2016/09/05 17:42:57 dholland Exp $"); +__KERNEL_RCSID(1, "$NetBSD: core_elf32.c,v 1.49 2016/09/29 20:40:53 christos Exp $"); #ifdef _KERNEL_OPT #include "opt_coredump.h" @@ -407,7 +407,6 @@ coredump_note_auxv(struct lwp *l, struct int error; struct proc *p = l->l_proc; void *uauxv, *kauxv; - size_t len; if ((error = copyin_psstrings(p, &pss)) != 0) return error; @@ -415,18 +414,9 @@ coredump_note_auxv(struct lwp *l, struct if (pss.ps_envstr == NULL) return EIO; - len = p->p_execsw->es_arglen; -#ifdef COMPAT_NETBSD32 - if (p->p_flag & PK_32) { - uauxv = (void *)((char *)pss.ps_envstr - + (pss.ps_nenvstr + 1) * sizeof(int32_t)); - len *= sizeof(int32_t); - } else -#endif - { - uauxv = (void *)(pss.ps_envstr + pss.ps_nenvstr + 1); - len *= sizeof(char *); - } + 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 * ptrsz; kauxv = kmem_alloc(len, KM_SLEEP); error = copyin_proc(p, uauxv, kauxv, len); Index: src/sys/kern/kern_proc.c diff -u src/sys/kern/kern_proc.c:1.197 src/sys/kern/kern_proc.c:1.198 --- src/sys/kern/kern_proc.c:1.197 Sat Sep 17 08:00:34 2016 +++ src/sys/kern/kern_proc.c Thu Sep 29 16:40:53 2016 @@ -1,4 +1,4 @@ -/* $NetBSD: kern_proc.c,v 1.197 2016/09/17 12:00:34 maxv Exp $ */ +/* $NetBSD: kern_proc.c,v 1.198 2016/09/29 20:40:53 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.197 2016/09/17 12:00:34 maxv Exp $"); +__KERNEL_RCSID(0, "$NetBSD: kern_proc.c,v 1.198 2016/09/29 20:40:53 christos Exp $"); #ifdef _KERNEL_OPT #include "opt_kstack.h" @@ -2052,12 +2052,6 @@ copy_procargs(struct proc *p, int oid, s goto done; } -#ifdef COMPAT_NETBSD32 - if (p->p_flag & PK_32) - entry_len = sizeof(netbsd32_charp); - else -#endif - entry_len = sizeof(char *); /* * Now copy each string. @@ -2065,6 +2059,7 @@ copy_procargs(struct proc *p, int oid, s len = 0; /* bytes written to user buffer */ loaded = 0; /* bytes from argv already processed */ i = 0; /* To make compiler happy */ + entry_len = PROC_PTRSZ(p); for (; argvlen; --argvlen) { int finished = 0; Index: src/sys/kern/sys_process.c diff -u src/sys/kern/sys_process.c:1.169 src/sys/kern/sys_process.c:1.170 --- src/sys/kern/sys_process.c:1.169 Wed May 25 13:43:58 2016 +++ src/sys/kern/sys_process.c Thu Sep 29 16:40:53 2016 @@ -1,4 +1,4 @@ -/* $NetBSD: sys_process.c,v 1.169 2016/05/25 17:43:58 christos Exp $ */ +/* $NetBSD: sys_process.c,v 1.170 2016/09/29 20:40:53 christos Exp $ */ /*- * Copyright (c) 2008, 2009 The NetBSD Foundation, Inc. @@ -118,7 +118,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: sys_process.c,v 1.169 2016/05/25 17:43:58 christos Exp $"); +__KERNEL_RCSID(0, "$NetBSD: sys_process.c,v 1.170 2016/09/29 20:40:53 christos Exp $"); #include "opt_ptrace.h" #include "opt_ktrace.h" @@ -563,7 +563,7 @@ sys_ptrace(struct lwp *l, const struct s case PIOD_READ_AUXV: req = PT_READ_D; uio.uio_rw = UIO_READ; - tmp = t->p_execsw->es_arglen * sizeof(char *); + tmp = t->p_execsw->es_arglen * PROC_PTRSZ(t); if (uio.uio_offset > tmp) return EIO; if (uio.uio_resid > tmp - uio.uio_offset) Index: src/sys/sys/proc.h diff -u src/sys/sys/proc.h:1.333 src/sys/sys/proc.h:1.334 --- src/sys/sys/proc.h:1.333 Fri Sep 23 10:09:39 2016 +++ src/sys/sys/proc.h Thu Sep 29 16:40:53 2016 @@ -1,4 +1,4 @@ -/* $NetBSD: proc.h,v 1.333 2016/09/23 14:09:39 skrll Exp $ */ +/* $NetBSD: proc.h,v 1.334 2016/09/29 20:40:53 christos Exp $ */ /*- * Copyright (c) 2006, 2007, 2008 The NetBSD Foundation, Inc. @@ -556,6 +556,8 @@ _proclist_skipmarker(struct proc *p0) return p; } +#define PROC_PTRSZ(p) (((p)->p_flag & PK_32) ? sizeof(int) : sizeof(void *)) + /* * PROCLIST_FOREACH: iterate on the given proclist, skipping PK_MARKER ones. */