From 7350dd84a0c2e03ec519968b219eb4f4e5f81536 Mon Sep 17 00:00:00 2001 From: Peter Wemm Date: Sat, 24 Feb 1996 14:37:30 +0000 Subject: If the two recently added sysctl variables exist, use those rather than the statically compiled PS_STRINGS and USRSTACK variables. This prevents programs using setproctitle from coredumping if the kernel VM is increased, and stops libkvm users (w, ps, etc) from needing to be recompiled if only the VM layout changes. --- lib/libkvm/kvm_proc.c | 19 +++++++++++++++++-- 1 file changed, 17 insertions(+), 2 deletions(-) (limited to 'lib/libkvm/kvm_proc.c') diff --git a/lib/libkvm/kvm_proc.c b/lib/libkvm/kvm_proc.c index c26e680b79a0..47773e7b4f6b 100644 --- a/lib/libkvm/kvm_proc.c +++ b/lib/libkvm/kvm_proc.c @@ -599,13 +599,23 @@ kvm_doargv(kd, kp, nchr, info) register char **ap; u_long addr; int cnt; - struct ps_strings arginfo; + struct ps_strings arginfo, *ps_strings; + int mib[2]; + size_t len; + + ps_strings = NULL; + mib[0] = CTL_KERN; + mib[1] = KERN_PS_STRINGS; + len = sizeof(ps_strings); + if (sysctl(mib, 2, &ps_strings, &len, NULL, 0) < 0 || + ps_strings == NULL) + ps_strings = PS_STRINGS; /* * Pointers are stored at the top of the user stack. */ if (p->p_stat == SZOMB || - kvm_uread(kd, p, USRSTACK - sizeof(arginfo), (char *)&arginfo, + kvm_uread(kd, p, ps_strings, (char *)&arginfo, sizeof(arginfo)) != sizeof(arginfo)) return (0); @@ -659,6 +669,11 @@ kvm_uread(kd, p, uva, buf, len) ssize_t amount; int fd; + if (!ISALIVE(kd)) { + _kvm_err(kd, kd->program, "cannot read user space from dead kernel"); + return(0); + } + cp = buf; sprintf(procfile, "/proc/%d/mem", p->p_pid); -- cgit v1.2.3