misc/167671: libkvm doesn't initialize vnet
David Marker
dmarker at gmail.com
Mon May 7 06:40:09 UTC 2012
>Number: 167671
>Category: misc
>Synopsis: libkvm doesn't initialize vnet
>Confidential: no
>Severity: non-critical
>Priority: low
>Responsible: freebsd-bugs
>State: open
>Quarter:
>Keywords:
>Date-Required:
>Class: sw-bug
>Submitter-Id: current-users
>Arrival-Date: Mon May 07 06:40:08 UTC 2012
>Closed-Date:
>Last-Modified:
>Originator: David Marker
>Release: 9.0-stable
>Organization:
>Environment:
FreeBSD familiar 9.0-STABLE FreeBSD 9.0-STABLE #0 r235098: Sun May 6 19:31:38 MDT 2012 root at familiar:/usr/obj/usr/src/sys/FAMILIAR amd64
>Description:
Adding "options VIMAGE" to kernel configuration causes symbol lookups to fail in libkvm.
For example `netstat -rn` will complain "netstat: no namelist"
>How-To-Repeat:
Add "options VIMAGE" to your kernel config, rebuild and install. Now `netstat -rn` will complain.
>Fix:
/usr/src/lib/libkvm/kvm_vnet.c is looking for "dumptid" (among other symbols) when calling _kvm_nlist() in _kvm_vnet_selectpid(). The other symbols are there, but "dumptid" is not and it causes _kvm_nlist() to return an error.
Further down the code, comments suggest the "dumptid" symbol is only supposed to be there if libkvm is working on a crashdump.
Removing "dumptid" from the nlist fixes the issue and `netstat -rn` works as normal again.
I'm attaching a patch that works, but I confess I do not understand how "dumptid" is supposed to work so it would be best to consider it just a starting point.
Patch attached with submission follows:
--- kvm_vnet.c 2012-05-06 23:27:25.701672209 -0600
+++ kvm_vnet.c 2012-05-06 23:49:27.186721426 -0600
@@ -75,12 +75,16 @@
{ .n_name = "vnet_head" },
#define NLIST_ALLPROC 3
{ .n_name = "allproc" },
-#define NLIST_DUMPTID 4
- { .n_name = "dumptid" },
-#define NLIST_PROC0 5
+#define NLIST_PROC0 4
{ .n_name = "proc0" },
{ .n_name = NULL },
};
+ struct nlist dnl[] = {
+#define NLIST_DUMPTID 5
+ { .n_name = "dumptid" },
+ { .n_name = NULL },
+ };
+
uintptr_t procp, credp;
#define VMCORE_VNET_OF_PROC0
#ifndef VMCORE_VNET_OF_PROC0
@@ -108,12 +112,15 @@
return (-1);
}
+ /* dumptid may not be there */
+ (void) _kvm_nlist(kd, dnl, 0);
+
/*
* Auto-detect if this is a crashdump by reading dumptid.
*/
dumptid = 0;
- if (nl[NLIST_DUMPTID].n_value) {
- if (kvm_read(kd, nl[NLIST_DUMPTID].n_value, &dumptid,
+ if (dnl[NLIST_DUMPTID].n_value) {
+ if (kvm_read(kd, dnl[NLIST_DUMPTID].n_value, &dumptid,
sizeof(dumptid)) != sizeof(dumptid)) {
_kvm_err(kd, kd->program, "%s: dumptid", __func__);
return (-1);
>Release-Note:
>Audit-Trail:
>Unformatted:
More information about the freebsd-bugs
mailing list