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 ||