Fully separate the kcore initialisation and the kinfo wrapper.
authorJoerg Sonnenberger <joerg@dragonflybsd.org>
Thu, 3 Feb 2005 17:28:40 +0000 (17:28 +0000)
committerJoerg Sonnenberger <joerg@dragonflybsd.org>
Thu, 3 Feb 2005 17:28:40 +0000 (17:28 +0000)
Call kcore_wrapper_open if you want the kinfo wrapper, otherwise
kcore_open. This fixes the segfaults in pstat.

Reported-by: Sven Willenberger <sven@dmv.com>
lib/libkcore/kcore.c
lib/libkcore/kcore.h
usr.sbin/pstat/Makefile
usr.sbin/pstat/pstat.c

index 38f7715..5b857f1 100644 (file)
@@ -31,7 +31,7 @@
  * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  * SUCH DAMAGE.
  * 
- * $DragonFly: src/lib/libkcore/kcore.c,v 1.5 2005/01/31 16:50:33 joerg Exp $
+ * $DragonFly: src/lib/libkcore/kcore.c,v 1.6 2005/02/03 17:28:40 joerg Exp $
  */
 
 #include <sys/param.h>
 
 struct kcore_data kcore_global;
 
+static int
+kcore_open_int(struct kcore_data *kc, const char *execfile,
+              const char *corefile, char *errbuf)
+{
+       kc->kd = kvm_openfiles(execfile, corefile, NULL, O_RDONLY, errbuf);
+
+       if (kc->kd == NULL)
+               return(-1);
+       else
+               return(0);
+}
+
+int
+kcore_wrapper_open(const char *execfile, const char *corefile, char *errbuf)
+{
+       return(kcore_open_int(&kcore_global, execfile, corefile, errbuf));
+}
+
 struct kcore_data *
 kcore_open(const char *execfile, const char *corefile, char *errbuf)
 {
@@ -55,11 +73,11 @@ kcore_open(const char *execfile, const char *corefile, char *errbuf)
        kc = malloc(sizeof(*kc));
        if (kc == NULL)
                return(NULL);
-       kc->kd = kvm_openfiles(execfile, corefile, NULL, O_RDONLY, errbuf);
-       if (kc->kd == NULL) {
+       if (kcore_open_int(kc, execfile, corefile, errbuf)) {
                free(kc);
                return(NULL);
        }
+
        return(kc);
 }
 
index a13b583..1181e18 100644 (file)
@@ -31,7 +31,7 @@
  * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  * SUCH DAMAGE.
  * 
- * $DragonFly: src/lib/libkcore/kcore.h,v 1.2 2004/12/22 11:01:49 joerg Exp $
+ * $DragonFly: src/lib/libkcore/kcore.h,v 1.3 2005/02/03 17:28:40 joerg Exp $
  */
 
 #ifndef _KCORE_H
@@ -77,6 +77,7 @@ struct kinfo_proc;
 __BEGIN_DECLS;
 struct kcore_data
        *kcore_open(const char *, const char *, char *);
+int     kcore_wrapper_open(const char *, const char *, char *);
 int     kcore_close(struct kcore_data *);
 
 int     kcore_get_cpus(struct kcore_data *, int *);
index 2d095b6..4d2dd8d 100644 (file)
@@ -1,9 +1,9 @@
 #      @(#)Makefile    8.1 (Berkeley) 6/6/93
 # $FreeBSD: src/usr.sbin/pstat/Makefile,v 1.5.6.1 2001/04/25 12:10:38 ru Exp $
-# $DragonFly: src/usr.sbin/pstat/Makefile,v 1.5 2004/11/24 22:51:01 joerg Exp $
+# $DragonFly: src/usr.sbin/pstat/Makefile,v 1.6 2005/02/03 17:28:40 joerg Exp $
 
 PROG=  pstat
-CFLAGS+=-I${.CURDIR}/../../sys
+CFLAGS+=-I${.CURDIR}/../../sys -g
 CFLAGS+=-DUSE_KCORE
 BINGRP=        kmem
 BINMODE=2555
index c12980e..a9a34ad 100644 (file)
@@ -33,7 +33,7 @@
  * @(#) Copyright (c) 1980, 1991, 1993, 1994 The Regents of the University of California.  All rights reserved.
  * @(#)pstat.c 8.16 (Berkeley) 5/9/95
  * $FreeBSD: src/usr.sbin/pstat/pstat.c,v 1.49.2.5 2002/07/12 09:12:49 des Exp $
- * $DragonFly: src/usr.sbin/pstat/pstat.c,v 1.13 2004/12/18 22:48:04 swildner Exp $
+ * $DragonFly: src/usr.sbin/pstat/pstat.c,v 1.14 2005/02/03 17:28:40 joerg Exp $
  */
 
 #define _KERNEL_STRUCTURES
@@ -77,9 +77,6 @@
 #ifdef USE_KCORE
 #  define KCORE_KINFO_WRAPPER
 #  include <kcore.h>
-
-struct kcore_data *KCORE_KVM_GLOBAL;
-
 #else
 #  include <kinfo.h>
 #endif
@@ -272,7 +269,7 @@ main(int argc, char **argv)
        if ((kd = kvm_openfiles(nlistf, memf, NULL, O_RDONLY, buf)) == 0)
                errx(1, "kvm_openfiles: %s", buf);
 #ifdef USE_KCORE
-       if ((KCORE_KVM_GLOBAL = kcore_open(nlistf, memf, buf)) == NULL)
+       if (kcore_wrapper_open(nlistf, memf, buf))
                errx(1, "kcore_open: %s", buf);
 #endif
        if ((ret = kvm_nlist(kd, nl)) != 0) {