summaryrefslogtreecommitdiff
path: root/lib/libkvm/kvm_proc.c
diff options
context:
space:
mode:
authorPeter Wemm <peter@FreeBSD.org>1996-02-24 14:37:30 +0000
committerPeter Wemm <peter@FreeBSD.org>1996-02-24 14:37:30 +0000
commit7350dd84a0c2e03ec519968b219eb4f4e5f81536 (patch)
tree00f5472548be9f315edc7d3c99327c3e16f41c16 /lib/libkvm/kvm_proc.c
parent99ac3bc8daec20f7a937487362d15fdf922d8008 (diff)
Notes
Diffstat (limited to 'lib/libkvm/kvm_proc.c')
-rw-r--r--lib/libkvm/kvm_proc.c19
1 files changed, 17 insertions, 2 deletions
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);