Module Name: src
Committed By: christos
Date: Fri Sep 13 13:55:24 UTC 2019
Modified Files:
src/usr.bin/pmap: main.c
Log Message:
deal with variable length namecache entries.
To generate a diff of this commit:
cvs rdiff -u -r1.26 -r1.27 src/usr.bin/pmap/main.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/pmap/main.c
diff -u src/usr.bin/pmap/main.c:1.26 src/usr.bin/pmap/main.c:1.27
--- src/usr.bin/pmap/main.c:1.26 Sun Dec 13 22:15:10 2015
+++ src/usr.bin/pmap/main.c Fri Sep 13 09:55:24 2019
@@ -1,4 +1,4 @@
-/* $NetBSD: main.c,v 1.26 2015/12/14 03:15:10 christos Exp $ */
+/* $NetBSD: main.c,v 1.27 2019/09/13 13:55:24 christos Exp $ */
/*
* Copyright (c) 2002, 2003 The NetBSD Foundation, Inc.
@@ -31,7 +31,7 @@
#include <sys/cdefs.h>
#ifndef lint
-__RCSID("$NetBSD: main.c,v 1.26 2015/12/14 03:15:10 christos Exp $");
+__RCSID("$NetBSD: main.c,v 1.27 2019/09/13 13:55:24 christos Exp $");
#endif
#include <sys/param.h>
@@ -467,7 +467,12 @@ mapname(void *addr)
void
load_name_cache(kvm_t *kd)
{
- struct namecache _ncp, *ncp, *oncp;
+ struct namecache *ncp, *oncp;
+ union {
+ struct namecache ncp;
+ char buf[sizeof(*ncp) + USHRT_MAX];
+ } _n;
+#define _ncp _n.ncp
struct nchashhead _ncpp, *ncpp;
u_long lnchash;
size_t nchash, i;
@@ -485,11 +490,19 @@ load_name_cache(kvm_t *kd)
ncpp = &nchashtbl[i];
oncp = NULL;
LIST_FOREACH(ncp, ncpp, nc_hash) {
+ size_t len;
+
if (ncp == oncp ||
ncp == (void*)0xdeadbeef)
break;
oncp = ncp;
- _KDEREF(kd, (u_long)ncp, &_ncp, sizeof(*ncp));
+ len = NCHNAMLEN;
+again:
+ _KDEREF(kd, (u_long)ncp, &_ncp, (len + sizeof(*ncp)));
+ if (_ncp.nc_nlen > len && _ncp.nc_nlen < 1024) {
+ len = _ncp.nc_nlen;
+ goto again;
+ }
ncp = &_ncp;
if (ncp->nc_nlen > 0) {
if (ncp->nc_nlen > 2 ||