Module Name:    src
Committed By:   simonb
Date:           Wed Mar  3 08:25:16 UTC 2021

Modified Files:
        src/usr.bin/vmstat: vmstat.c

Log Message:
For vmstat -h/-H, calculate the hash element size correctly instead of
assuming that everything that isn't a list is a tailq.  Fixes random
reads from kmem that either fail or return incorrect data for the vcache
hash table.


To generate a diff of this commit:
cvs rdiff -u -r1.242 -r1.243 src/usr.bin/vmstat/vmstat.c

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/usr.bin/vmstat/vmstat.c
diff -u src/usr.bin/vmstat/vmstat.c:1.242 src/usr.bin/vmstat/vmstat.c:1.243
--- src/usr.bin/vmstat/vmstat.c:1.242	Sun Jun 14 21:41:42 2020
+++ src/usr.bin/vmstat/vmstat.c	Wed Mar  3 08:25:16 2021
@@ -1,4 +1,4 @@
-/* $NetBSD: vmstat.c,v 1.242 2020/06/14 21:41:42 ad Exp $ */
+/* $NetBSD: vmstat.c,v 1.243 2021/03/03 08:25:16 simonb Exp $ */
 
 /*-
  * Copyright (c) 1998, 2000, 2001, 2007, 2019, 2020
@@ -71,7 +71,7 @@ __COPYRIGHT("@(#) Copyright (c) 1980, 19
 #if 0
 static char sccsid[] = "@(#)vmstat.c	8.2 (Berkeley) 3/1/95";
 #else
-__RCSID("$NetBSD: vmstat.c,v 1.242 2020/06/14 21:41:42 ad Exp $");
+__RCSID("$NetBSD: vmstat.c,v 1.243 2021/03/03 08:25:16 simonb Exp $");
 #endif
 #endif /* not lint */
 
@@ -1964,8 +1964,20 @@ dohashstat(int verbose, int todo, const 
 		if (hashname != NULL &&
 		    strcmp(hashnl[curhash->hashsize].n_name + 1, hashname))
 			continue;
-		elemsize = curhash->type == HASH_LIST ?
-		    sizeof(*hashtbl_list) : sizeof(*hashtbl_tailq);
+		switch (curhash->type) {
+		case HASH_LIST:
+			elemsize = sizeof(*hashtbl_list);
+			break;
+		case HASH_SLIST:
+			elemsize = sizeof(*hashtbl_slist);
+			break;
+		case HASH_TAILQ:
+			elemsize = sizeof(*hashtbl_tailq);
+			break;
+		default:
+			/* shouldn't get here */
+			continue;
+		}
 		deref_kptr((void *)hashnl[curhash->hashsize].n_value,
 		    &hashsize, sizeof(hashsize),
 		    hashnl[curhash->hashsize].n_name);

Reply via email to