Subject: lib/347: minor bug in libkvm
To: None <gnats-admin>
From: Alasdair Baird <alasdair@wildcat.demon.co.uk>
List: netbsd-bugs
Date: 07/19/1994 14:50:06
>Number: 347
>Category: lib
>Synopsis: libkvm returns garbage for null process environments
>Confidential: no
>Severity: non-critical
>Priority: low
>Responsible: gnats-admin (Library Bug People)
>State: open
>Class: sw-bug
>Submitter-Id: net
>Arrival-Date: Tue Jul 19 14:50:05 1994
>Originator: & Baird
>Organization:
absolutely none whatsoever
>Release: current of 18/7/94
>Environment:
System: NetBSD wildcat.demon.co.uk 1.0-ALPHA NetBSD 1.0-ALPHA (WILDCAT) #20: Tue Jul 19 21:31:48 BST 1994 root@wildcat.demon.co.uk:/usr/src/sys/arch/i386/compile/WILDCAT i386
>Description:
Commands such as /bin/ps that return information about other
processes environments via a call to libkvm return bogus
information for those processes with null (non-existent)
environments (also for those with null argument lists, though
these are not so common).
In libkvm/kvm_proc.c the code that obtains argv/env goop
does noes not check to see if there are zero items in either
the argument or environment vectors; it assumes there must
be something and guddles around to return something. (This
could might even cause a crash on architectures that are
more sensitive to dereferencing bad pointers than that which
I use.)
>How-To-Repeat:
Run "/bin/ps axe" and observe garbage for the environment for
commands such as "/sbin/init" that do not have any environment.
(/usr/libexec/getty does the same, but the garbage is subtly
believable.)
>Fix:
The fix is very simple, requiring a minor modification to one
line of kvm_proc.c. This change checks the number of elements
in the argv/env and only goes looking for stuff if there is
something to look for. Context diff follows:
*** kvm_proc.c.old Wed May 25 12:37:47 1994
--- kvm_proc.c Tue Jul 19 21:55:32 1994
***************
*** 657,663 ****
return (0);
(*info)(&arginfo, &addr, &cnt);
! ap = kvm_argv(kd, p, addr, cnt, nchr);
/*
* For live kernels, make sure this process didn't go away.
*/
--- 657,663 ----
return (0);
(*info)(&arginfo, &addr, &cnt);
! ap = (cnt == 0) ? 0 : kvm_argv(kd, p, addr, cnt, nchr);
/*
* For live kernels, make sure this process didn't go away.
*/
I have compiled this and checked it against a recompiled /bin/ps
and it seems to work correctly there at least. I have not checked
it against any other libkvm users, but don't forsee any grief with
other utilities.
Alasdair.
>Audit-Trail:
>Unformatted:
------------------------------------------------------------------------------