Tue Sep 4 16:03:56 2018 UTC ()
Clear the kernel pointers from kern.proc and kern.proc2 when the user is
not privileged.


(maxv)
diff -r1.216 -r1.217 src/sys/kern/kern_proc.c

cvs diff -r1.216 -r1.217 src/sys/kern/kern_proc.c (expand / switch to unified diff)

--- src/sys/kern/kern_proc.c 2018/09/04 15:48:44 1.216
+++ src/sys/kern/kern_proc.c 2018/09/04 16:03:56 1.217
@@ -1,14 +1,14 @@ @@ -1,14 +1,14 @@
1/* $NetBSD: kern_proc.c,v 1.216 2018/09/04 15:48:44 maxv Exp $ */ 1/* $NetBSD: kern_proc.c,v 1.217 2018/09/04 16:03:56 maxv Exp $ */
2 2
3/*- 3/*-
4 * Copyright (c) 1999, 2006, 2007, 2008 The NetBSD Foundation, Inc. 4 * Copyright (c) 1999, 2006, 2007, 2008 The NetBSD Foundation, Inc.
5 * All rights reserved. 5 * All rights reserved.
6 * 6 *
7 * This code is derived from software contributed to The NetBSD Foundation 7 * This code is derived from software contributed to The NetBSD Foundation
8 * by Jason R. Thorpe of the Numerical Aerospace Simulation Facility, 8 * by Jason R. Thorpe of the Numerical Aerospace Simulation Facility,
9 * NASA Ames Research Center, and by Andrew Doran. 9 * NASA Ames Research Center, and by Andrew Doran.
10 * 10 *
11 * Redistribution and use in source and binary forms, with or without 11 * Redistribution and use in source and binary forms, with or without
12 * modification, are permitted provided that the following conditions 12 * modification, are permitted provided that the following conditions
13 * are met: 13 * are met:
14 * 1. Redistributions of source code must retain the above copyright 14 * 1. Redistributions of source code must retain the above copyright
@@ -52,27 +52,27 @@ @@ -52,27 +52,27 @@
52 * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 52 * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
53 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 53 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
54 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 54 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
55 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 55 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
56 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 56 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
57 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 57 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
58 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 58 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
59 * SUCH DAMAGE. 59 * SUCH DAMAGE.
60 * 60 *
61 * @(#)kern_proc.c 8.7 (Berkeley) 2/14/95 61 * @(#)kern_proc.c 8.7 (Berkeley) 2/14/95
62 */ 62 */
63 63
64#include <sys/cdefs.h> 64#include <sys/cdefs.h>
65__KERNEL_RCSID(0, "$NetBSD: kern_proc.c,v 1.216 2018/09/04 15:48:44 maxv Exp $"); 65__KERNEL_RCSID(0, "$NetBSD: kern_proc.c,v 1.217 2018/09/04 16:03:56 maxv Exp $");
66 66
67#ifdef _KERNEL_OPT 67#ifdef _KERNEL_OPT
68#include "opt_kstack.h" 68#include "opt_kstack.h"
69#include "opt_maxuprc.h" 69#include "opt_maxuprc.h"
70#include "opt_dtrace.h" 70#include "opt_dtrace.h"
71#include "opt_compat_netbsd32.h" 71#include "opt_compat_netbsd32.h"
72#endif 72#endif
73 73
74#if defined(__HAVE_COMPAT_NETBSD32) && !defined(COMPAT_NETBSD32) \ 74#if defined(__HAVE_COMPAT_NETBSD32) && !defined(COMPAT_NETBSD32) \
75 && !defined(_RUMPKERNEL) 75 && !defined(_RUMPKERNEL)
76#define COMPAT_NETBSD32 76#define COMPAT_NETBSD32
77#endif 77#endif
78 78
@@ -2150,42 +2150,55 @@ copy_procargs(struct proc *p, int oid, s @@ -2150,42 +2150,55 @@ copy_procargs(struct proc *p, int oid, s
2150 len += xlen; 2150 len += xlen;
2151 base += xlen; 2151 base += xlen;
2152 } 2152 }
2153 } 2153 }
2154 *limit = len; 2154 *limit = len;
2155 2155
2156done: 2156done:
2157 kmem_free(argv, PAGE_SIZE); 2157 kmem_free(argv, PAGE_SIZE);
2158 kmem_free(arg, PAGE_SIZE); 2158 kmem_free(arg, PAGE_SIZE);
2159 uvmspace_free(vmspace); 2159 uvmspace_free(vmspace);
2160 return error; 2160 return error;
2161} 2161}
2162 2162
 2163#define SET_KERN_ADDR(dst, src, allow) \
 2164 do { \
 2165 if (allow) \
 2166 dst = src; \
 2167 } while (0);
 2168
2163/* 2169/*
2164 * Fill in an eproc structure for the specified process. 2170 * Fill in an eproc structure for the specified process.
2165 */ 2171 */
2166void 2172void
2167fill_eproc(struct proc *p, struct eproc *ep, bool zombie) 2173fill_eproc(struct proc *p, struct eproc *ep, bool zombie)
2168{ 2174{
 2175 bool allowaddr;
2169 struct tty *tp; 2176 struct tty *tp;
2170 struct lwp *l; 2177 struct lwp *l;
 2178 int error;
2171 2179
2172 KASSERT(mutex_owned(proc_lock)); 2180 KASSERT(mutex_owned(proc_lock));
2173 KASSERT(mutex_owned(p->p_lock)); 2181 KASSERT(mutex_owned(p->p_lock));
2174 2182
2175 memset(ep, 0, sizeof(*ep)); 2183 memset(ep, 0, sizeof(*ep));
2176 2184
2177 ep->e_paddr = p; 2185 /* If not privileged, don't expose kernel addresses. */
2178 ep->e_sess = p->p_session; 2186 error = kauth_authorize_process(kauth_cred_get(), KAUTH_PROCESS_CANSEE,
 2187 curproc, KAUTH_ARG(KAUTH_REQ_PROCESS_CANSEE_KPTR), NULL, NULL);
 2188 allowaddr = (error == 0);
 2189
 2190 SET_KERN_ADDR(ep->e_paddr, p, allowaddr);
 2191 SET_KERN_ADDR(ep->e_sess, p->p_session, allowaddr);
2179 if (p->p_cred) { 2192 if (p->p_cred) {
2180 kauth_cred_topcred(p->p_cred, &ep->e_pcred); 2193 kauth_cred_topcred(p->p_cred, &ep->e_pcred);
2181 kauth_cred_toucred(p->p_cred, &ep->e_ucred); 2194 kauth_cred_toucred(p->p_cred, &ep->e_ucred);
2182 } 2195 }
2183 if (p->p_stat != SIDL && !P_ZOMBIE(p) && !zombie) { 2196 if (p->p_stat != SIDL && !P_ZOMBIE(p) && !zombie) {
2184 struct vmspace *vm = p->p_vmspace; 2197 struct vmspace *vm = p->p_vmspace;
2185 2198
2186 ep->e_vm.vm_rssize = vm_resident_count(vm); 2199 ep->e_vm.vm_rssize = vm_resident_count(vm);
2187 ep->e_vm.vm_tsize = vm->vm_tsize; 2200 ep->e_vm.vm_tsize = vm->vm_tsize;
2188 ep->e_vm.vm_dsize = vm->vm_dsize; 2201 ep->e_vm.vm_dsize = vm->vm_dsize;
2189 ep->e_vm.vm_ssize = vm->vm_ssize; 2202 ep->e_vm.vm_ssize = vm->vm_ssize;
2190 ep->e_vm.vm_map.size = vm->vm_map.size; 2203 ep->e_vm.vm_map.size = vm->vm_map.size;
2191 2204
@@ -2196,94 +2209,101 @@ fill_eproc(struct proc *p, struct eproc  @@ -2196,94 +2209,101 @@ fill_eproc(struct proc *p, struct eproc
2196 if (l->l_wchan) 2209 if (l->l_wchan)
2197 strncpy(ep->e_wmesg, l->l_wmesg, WMESGLEN); 2210 strncpy(ep->e_wmesg, l->l_wmesg, WMESGLEN);
2198 lwp_unlock(l); 2211 lwp_unlock(l);
2199 } 2212 }
2200 ep->e_ppid = p->p_ppid; 2213 ep->e_ppid = p->p_ppid;
2201 if (p->p_pgrp && p->p_session) { 2214 if (p->p_pgrp && p->p_session) {
2202 ep->e_pgid = p->p_pgrp->pg_id; 2215 ep->e_pgid = p->p_pgrp->pg_id;
2203 ep->e_jobc = p->p_pgrp->pg_jobc; 2216 ep->e_jobc = p->p_pgrp->pg_jobc;
2204 ep->e_sid = p->p_session->s_sid; 2217 ep->e_sid = p->p_session->s_sid;
2205 if ((p->p_lflag & PL_CONTROLT) && 2218 if ((p->p_lflag & PL_CONTROLT) &&
2206 (tp = p->p_session->s_ttyp)) { 2219 (tp = p->p_session->s_ttyp)) {
2207 ep->e_tdev = tp->t_dev; 2220 ep->e_tdev = tp->t_dev;
2208 ep->e_tpgid = tp->t_pgrp ? tp->t_pgrp->pg_id : NO_PGID; 2221 ep->e_tpgid = tp->t_pgrp ? tp->t_pgrp->pg_id : NO_PGID;
2209 ep->e_tsess = tp->t_session; 2222 SET_KERN_ADDR(ep->e_tsess, tp->t_session, allowaddr);
2210 } else 2223 } else
2211 ep->e_tdev = (uint32_t)NODEV; 2224 ep->e_tdev = (uint32_t)NODEV;
2212 ep->e_flag = p->p_session->s_ttyvp ? EPROC_CTTY : 0; 2225 ep->e_flag = p->p_session->s_ttyvp ? EPROC_CTTY : 0;
2213 if (SESS_LEADER(p)) 2226 if (SESS_LEADER(p))
2214 ep->e_flag |= EPROC_SLEADER; 2227 ep->e_flag |= EPROC_SLEADER;
2215 strncpy(ep->e_login, p->p_session->s_login, MAXLOGNAME); 2228 strncpy(ep->e_login, p->p_session->s_login, MAXLOGNAME);
2216 } 2229 }
2217 ep->e_xsize = ep->e_xrssize = 0; 2230 ep->e_xsize = ep->e_xrssize = 0;
2218 ep->e_xccount = ep->e_xswrss = 0; 2231 ep->e_xccount = ep->e_xswrss = 0;
2219} 2232}
2220 2233
2221/* 2234/*
2222 * Fill in a kinfo_proc2 structure for the specified process. 2235 * Fill in a kinfo_proc2 structure for the specified process.
2223 */ 2236 */
2224void 2237void
2225fill_kproc2(struct proc *p, struct kinfo_proc2 *ki, bool zombie) 2238fill_kproc2(struct proc *p, struct kinfo_proc2 *ki, bool zombie)
2226{ 2239{
2227 struct tty *tp; 2240 struct tty *tp;
2228 struct lwp *l, *l2; 2241 struct lwp *l, *l2;
2229 struct timeval ut, st, rt; 2242 struct timeval ut, st, rt;
2230 sigset_t ss1, ss2; 2243 sigset_t ss1, ss2;
2231 struct rusage ru; 2244 struct rusage ru;
2232 struct vmspace *vm; 2245 struct vmspace *vm;
 2246 bool allowaddr;
 2247 int error;
2233 2248
2234 KASSERT(mutex_owned(proc_lock)); 2249 KASSERT(mutex_owned(proc_lock));
2235 KASSERT(mutex_owned(p->p_lock)); 2250 KASSERT(mutex_owned(p->p_lock));
2236 2251
 2252 /* If not privileged, don't expose kernel addresses. */
 2253 error = kauth_authorize_process(kauth_cred_get(), KAUTH_PROCESS_CANSEE,
 2254 curproc, KAUTH_ARG(KAUTH_REQ_PROCESS_CANSEE_KPTR), NULL, NULL);
 2255 allowaddr = (error == 0);
 2256
2237 sigemptyset(&ss1); 2257 sigemptyset(&ss1);
2238 sigemptyset(&ss2); 2258 sigemptyset(&ss2);
2239 memset(ki, 0, sizeof(*ki)); 2259 memset(ki, 0, sizeof(*ki));
2240 2260
2241 ki->p_paddr = PTRTOUINT64(p); 2261 SET_KERN_ADDR(ki->p_paddr, PTRTOUINT64(p), allowaddr);
2242 ki->p_fd = PTRTOUINT64(p->p_fd); 2262 SET_KERN_ADDR(ki->p_fd, PTRTOUINT64(p->p_fd), allowaddr);
2243 ki->p_cwdi = PTRTOUINT64(p->p_cwdi); 2263 SET_KERN_ADDR(ki->p_cwdi, PTRTOUINT64(p->p_cwdi), allowaddr);
2244 ki->p_stats = PTRTOUINT64(p->p_stats); 2264 SET_KERN_ADDR(ki->p_stats, PTRTOUINT64(p->p_stats), allowaddr);
2245 ki->p_limit = PTRTOUINT64(p->p_limit); 2265 SET_KERN_ADDR(ki->p_limit, PTRTOUINT64(p->p_limit), allowaddr);
2246 ki->p_vmspace = PTRTOUINT64(p->p_vmspace); 2266 SET_KERN_ADDR(ki->p_vmspace, PTRTOUINT64(p->p_vmspace), allowaddr);
2247 ki->p_sigacts = PTRTOUINT64(p->p_sigacts); 2267 SET_KERN_ADDR(ki->p_sigacts, PTRTOUINT64(p->p_sigacts), allowaddr);
2248 ki->p_sess = PTRTOUINT64(p->p_session); 2268 SET_KERN_ADDR(ki->p_sess, PTRTOUINT64(p->p_session), allowaddr);
2249 ki->p_tsess = 0; /* may be changed if controlling tty below */ 2269 ki->p_tsess = 0; /* may be changed if controlling tty below */
2250 ki->p_ru = PTRTOUINT64(&p->p_stats->p_ru); 2270 SET_KERN_ADDR(ki->p_ru, PTRTOUINT64(&p->p_stats->p_ru), allowaddr);
2251 ki->p_eflag = 0; 2271 ki->p_eflag = 0;
2252 ki->p_exitsig = p->p_exitsig; 2272 ki->p_exitsig = p->p_exitsig;
2253 ki->p_flag = L_INMEM; /* Process never swapped out */ 2273 ki->p_flag = L_INMEM; /* Process never swapped out */
2254 ki->p_flag |= sysctl_map_flags(sysctl_flagmap, p->p_flag); 2274 ki->p_flag |= sysctl_map_flags(sysctl_flagmap, p->p_flag);
2255 ki->p_flag |= sysctl_map_flags(sysctl_sflagmap, p->p_sflag); 2275 ki->p_flag |= sysctl_map_flags(sysctl_sflagmap, p->p_sflag);
2256 ki->p_flag |= sysctl_map_flags(sysctl_slflagmap, p->p_slflag); 2276 ki->p_flag |= sysctl_map_flags(sysctl_slflagmap, p->p_slflag);
2257 ki->p_flag |= sysctl_map_flags(sysctl_lflagmap, p->p_lflag); 2277 ki->p_flag |= sysctl_map_flags(sysctl_lflagmap, p->p_lflag);
2258 ki->p_flag |= sysctl_map_flags(sysctl_stflagmap, p->p_stflag); 2278 ki->p_flag |= sysctl_map_flags(sysctl_stflagmap, p->p_stflag);
2259 ki->p_pid = p->p_pid; 2279 ki->p_pid = p->p_pid;
2260 ki->p_ppid = p->p_ppid; 2280 ki->p_ppid = p->p_ppid;
2261 ki->p_uid = kauth_cred_geteuid(p->p_cred); 2281 ki->p_uid = kauth_cred_geteuid(p->p_cred);
2262 ki->p_ruid = kauth_cred_getuid(p->p_cred); 2282 ki->p_ruid = kauth_cred_getuid(p->p_cred);
2263 ki->p_gid = kauth_cred_getegid(p->p_cred); 2283 ki->p_gid = kauth_cred_getegid(p->p_cred);
2264 ki->p_rgid = kauth_cred_getgid(p->p_cred); 2284 ki->p_rgid = kauth_cred_getgid(p->p_cred);
2265 ki->p_svuid = kauth_cred_getsvuid(p->p_cred); 2285 ki->p_svuid = kauth_cred_getsvuid(p->p_cred);
2266 ki->p_svgid = kauth_cred_getsvgid(p->p_cred); 2286 ki->p_svgid = kauth_cred_getsvgid(p->p_cred);
2267 ki->p_ngroups = kauth_cred_ngroups(p->p_cred); 2287 ki->p_ngroups = kauth_cred_ngroups(p->p_cred);
2268 kauth_cred_getgroups(p->p_cred, ki->p_groups, 2288 kauth_cred_getgroups(p->p_cred, ki->p_groups,
2269 uimin(ki->p_ngroups, sizeof(ki->p_groups) / sizeof(ki->p_groups[0])), 2289 uimin(ki->p_ngroups, sizeof(ki->p_groups) / sizeof(ki->p_groups[0])),
2270 UIO_SYSSPACE); 2290 UIO_SYSSPACE);
2271 2291
2272 ki->p_uticks = p->p_uticks; 2292 ki->p_uticks = p->p_uticks;
2273 ki->p_sticks = p->p_sticks; 2293 ki->p_sticks = p->p_sticks;
2274 ki->p_iticks = p->p_iticks; 2294 ki->p_iticks = p->p_iticks;
2275 ki->p_tpgid = NO_PGID; /* may be changed if controlling tty below */ 2295 ki->p_tpgid = NO_PGID; /* may be changed if controlling tty below */
2276 ki->p_tracep = PTRTOUINT64(p->p_tracep); 2296 SET_KERN_ADDR(ki->p_tracep, PTRTOUINT64(p->p_tracep), allowaddr);
2277 ki->p_traceflag = p->p_traceflag; 2297 ki->p_traceflag = p->p_traceflag;
2278 2298
2279 memcpy(&ki->p_sigignore, &p->p_sigctx.ps_sigignore,sizeof(ki_sigset_t)); 2299 memcpy(&ki->p_sigignore, &p->p_sigctx.ps_sigignore,sizeof(ki_sigset_t));
2280 memcpy(&ki->p_sigcatch, &p->p_sigctx.ps_sigcatch, sizeof(ki_sigset_t)); 2300 memcpy(&ki->p_sigcatch, &p->p_sigctx.ps_sigcatch, sizeof(ki_sigset_t));
2281 2301
2282 ki->p_cpticks = 0; 2302 ki->p_cpticks = 0;
2283 ki->p_pctcpu = p->p_pctcpu; 2303 ki->p_pctcpu = p->p_pctcpu;
2284 ki->p_estcpu = 0; 2304 ki->p_estcpu = 0;
2285 ki->p_stat = p->p_stat; /* Will likely be overridden by LWP status */ 2305 ki->p_stat = p->p_stat; /* Will likely be overridden by LWP status */
2286 ki->p_realstat = p->p_stat; 2306 ki->p_realstat = p->p_stat;
2287 ki->p_nice = p->p_nice; 2307 ki->p_nice = p->p_nice;
2288 ki->p_xstat = P_WAITSTATUS(p); 2308 ki->p_xstat = P_WAITSTATUS(p);
2289 ki->p_acflag = p->p_acflag; 2309 ki->p_acflag = p->p_acflag;
@@ -2307,40 +2327,40 @@ fill_kproc2(struct proc *p, struct kinfo @@ -2307,40 +2327,40 @@ fill_kproc2(struct proc *p, struct kinfo
2307 * PROT_NONE and grown as needed, adjust the "mapped size" 2327 * PROT_NONE and grown as needed, adjust the "mapped size"
2308 * to skip the unused stack portion. 2328 * to skip the unused stack portion.
2309 */ 2329 */
2310 ki->p_vm_msize = 2330 ki->p_vm_msize =
2311 atop(vm->vm_map.size) - vm->vm_issize + vm->vm_ssize; 2331 atop(vm->vm_map.size) - vm->vm_issize + vm->vm_ssize;
2312 2332
2313 /* Pick the primary (first) LWP */ 2333 /* Pick the primary (first) LWP */
2314 l = proc_active_lwp(p); 2334 l = proc_active_lwp(p);
2315 KASSERT(l != NULL); 2335 KASSERT(l != NULL);
2316 lwp_lock(l); 2336 lwp_lock(l);
2317 ki->p_nrlwps = p->p_nrlwps; 2337 ki->p_nrlwps = p->p_nrlwps;
2318 ki->p_forw = 0; 2338 ki->p_forw = 0;
2319 ki->p_back = 0; 2339 ki->p_back = 0;
2320 ki->p_addr = PTRTOUINT64(l->l_addr); 2340 SET_KERN_ADDR(ki->p_addr, PTRTOUINT64(l->l_addr), allowaddr);
2321 ki->p_stat = l->l_stat; 2341 ki->p_stat = l->l_stat;
2322 ki->p_flag |= sysctl_map_flags(sysctl_lwpflagmap, l->l_flag); 2342 ki->p_flag |= sysctl_map_flags(sysctl_lwpflagmap, l->l_flag);
2323 ki->p_swtime = l->l_swtime; 2343 ki->p_swtime = l->l_swtime;
2324 ki->p_slptime = l->l_slptime; 2344 ki->p_slptime = l->l_slptime;
2325 if (l->l_stat == LSONPROC) 2345 if (l->l_stat == LSONPROC)
2326 ki->p_schedflags = l->l_cpu->ci_schedstate.spc_flags; 2346 ki->p_schedflags = l->l_cpu->ci_schedstate.spc_flags;
2327 else 2347 else
2328 ki->p_schedflags = 0; 2348 ki->p_schedflags = 0;
2329 ki->p_priority = lwp_eprio(l); 2349 ki->p_priority = lwp_eprio(l);
2330 ki->p_usrpri = l->l_priority; 2350 ki->p_usrpri = l->l_priority;
2331 if (l->l_wchan) 2351 if (l->l_wchan)
2332 strncpy(ki->p_wmesg, l->l_wmesg, sizeof(ki->p_wmesg)); 2352 strncpy(ki->p_wmesg, l->l_wmesg, sizeof(ki->p_wmesg));
2333 ki->p_wchan = PTRTOUINT64(l->l_wchan); 2353 SET_KERN_ADDR(ki->p_wchan, PTRTOUINT64(l->l_wchan), allowaddr);
2334 ki->p_cpuid = cpu_index(l->l_cpu); 2354 ki->p_cpuid = cpu_index(l->l_cpu);
2335 lwp_unlock(l); 2355 lwp_unlock(l);
2336 LIST_FOREACH(l, &p->p_lwps, l_sibling) { 2356 LIST_FOREACH(l, &p->p_lwps, l_sibling) {
2337 /* This is hardly correct, but... */ 2357 /* This is hardly correct, but... */
2338 sigplusset(&l->l_sigpend.sp_set, &ss1); 2358 sigplusset(&l->l_sigpend.sp_set, &ss1);
2339 sigplusset(&l->l_sigmask, &ss2); 2359 sigplusset(&l->l_sigmask, &ss2);
2340 ki->p_cpticks += l->l_cpticks; 2360 ki->p_cpticks += l->l_cpticks;
2341 ki->p_pctcpu += l->l_pctcpu; 2361 ki->p_pctcpu += l->l_pctcpu;
2342 ki->p_estcpu += l->l_estcpu; 2362 ki->p_estcpu += l->l_estcpu;
2343 } 2363 }
2344 } 2364 }
2345 sigplusset(&p->p_sigpend.sp_set, &ss2); 2365 sigplusset(&p->p_sigpend.sp_set, &ss2);
2346 memcpy(&ki->p_siglist, &ss1, sizeof(ki_sigset_t)); 2366 memcpy(&ki->p_siglist, &ss1, sizeof(ki_sigset_t));
@@ -2349,27 +2369,28 @@ fill_kproc2(struct proc *p, struct kinfo @@ -2349,27 +2369,28 @@ fill_kproc2(struct proc *p, struct kinfo
2349 if (p->p_session != NULL) { 2369 if (p->p_session != NULL) {
2350 ki->p_sid = p->p_session->s_sid; 2370 ki->p_sid = p->p_session->s_sid;
2351 ki->p__pgid = p->p_pgrp->pg_id; 2371 ki->p__pgid = p->p_pgrp->pg_id;
2352 if (p->p_session->s_ttyvp) 2372 if (p->p_session->s_ttyvp)
2353 ki->p_eflag |= EPROC_CTTY; 2373 ki->p_eflag |= EPROC_CTTY;
2354 if (SESS_LEADER(p)) 2374 if (SESS_LEADER(p))
2355 ki->p_eflag |= EPROC_SLEADER; 2375 ki->p_eflag |= EPROC_SLEADER;
2356 strncpy(ki->p_login, p->p_session->s_login, 2376 strncpy(ki->p_login, p->p_session->s_login,
2357 uimin(sizeof ki->p_login - 1, sizeof p->p_session->s_login)); 2377 uimin(sizeof ki->p_login - 1, sizeof p->p_session->s_login));
2358 ki->p_jobc = p->p_pgrp->pg_jobc; 2378 ki->p_jobc = p->p_pgrp->pg_jobc;
2359 if ((p->p_lflag & PL_CONTROLT) && (tp = p->p_session->s_ttyp)) { 2379 if ((p->p_lflag & PL_CONTROLT) && (tp = p->p_session->s_ttyp)) {
2360 ki->p_tdev = tp->t_dev; 2380 ki->p_tdev = tp->t_dev;
2361 ki->p_tpgid = tp->t_pgrp ? tp->t_pgrp->pg_id : NO_PGID; 2381 ki->p_tpgid = tp->t_pgrp ? tp->t_pgrp->pg_id : NO_PGID;
2362 ki->p_tsess = PTRTOUINT64(tp->t_session); 2382 SET_KERN_ADDR(ki->p_tsess, PTRTOUINT64(tp->t_session),
 2383 allowaddr);
2363 } else { 2384 } else {
2364 ki->p_tdev = (int32_t)NODEV; 2385 ki->p_tdev = (int32_t)NODEV;
2365 } 2386 }
2366 } 2387 }
2367 2388
2368 if (!P_ZOMBIE(p) && !zombie) { 2389 if (!P_ZOMBIE(p) && !zombie) {
2369 ki->p_uvalid = 1; 2390 ki->p_uvalid = 1;
2370 ki->p_ustart_sec = p->p_stats->p_start.tv_sec; 2391 ki->p_ustart_sec = p->p_stats->p_start.tv_sec;
2371 ki->p_ustart_usec = p->p_stats->p_start.tv_usec; 2392 ki->p_ustart_usec = p->p_stats->p_start.tv_usec;
2372 2393
2373 calcru(p, &ut, &st, NULL, &rt); 2394 calcru(p, &ut, &st, NULL, &rt);
2374 ki->p_rtime_sec = rt.tv_sec; 2395 ki->p_rtime_sec = rt.tv_sec;
2375 ki->p_rtime_usec = rt.tv_usec; 2396 ki->p_rtime_usec = rt.tv_usec;