Re: git: 4617a6cb82a6 - main - nlist: Handle multiple symbol tables

From: John Baldwin <jhb_at_FreeBSD.org>
Date: Fri, 28 Aug 2026 18:22:38 UTC
On 5/19/26 02:53, Dag-Erling Smørg rav wrote:
> The branch main has been updated by des:
> 
> URL: https://cgit.FreeBSD.org/src/commit/?id=4617a6cb82a673b02257257c1f5f8a3c8d2bb943
> 
> commit 4617a6cb82a673b02257257c1f5f8a3c8d2bb943
> Author:     Dag-Erling Smørgrav <des@FreeBSD.org>
> AuthorDate: 2026-05-19 06:52:53 +0000
> Commit:     Dag-Erling Smørgrav <des@FreeBSD.org>
> CommitDate: 2026-05-19 06:53:35 +0000
> 
>      nlist: Handle multiple symbol tables
>      
>      * Instead of looking for and stopping at the first SHT_SYMTAB section,
>        iterate over all SHT_DYNSYM and SHT_SYMTAB sections until we've either
>        found all our symbols or run out.
>      
>      * Perform bounds checks on section and string table offsets and sizes
>        before attempting to mmap() the string table.
>      
>      * Perform bounds checks on individual symbol table entries before
>        attempting to access the corresponding strings.
>      
>      * Stop treating _Foo and Foo as the same symbol.
>      
>      This unbreaks OpenSSH which uses nlist(3) to verify PKCS#11 providers.

The _Foo vs Foo change broke many uses of kvm_nlist in the tree.  In particular,
ktrdump no longer works on crashdumps now, and I finally single-stepped through
it today to figure out why.

A quick grep shows me all these places that are now broken:

lib/libkvm/kvm_cptime.c:        { .n_name = "_cp_time" },               /* (deprecated) */
lib/libkvm/kvm_getloadavg.c:    { .n_name = "_averunnable" },
lib/libkvm/kvm_getloadavg.c:    { .n_name = "_fscale" },
lib/libkvm/kvm_getswapinfo.c:   { .n_name = "_swtailq" },       /* list of swap devices and sizes */
lib/libkvm/kvm_getswapinfo.c:   { .n_name = "_dmmax" },         /* maximum size of a swap block */
lib/libkvm/kvm_pcpu.c:  { .n_name = "_cpuid_to_pcpu" },
lib/libkvm/kvm_pcpu.c:  { .n_name = "_mp_maxcpus" },
lib/libkvm/kvm_pcpu.c:  { .n_name = "_mp_ncpus" },
lib/libkvm/kvm_pcpu.c:  { .n_name = "___pcpu" },
lib/libkvm/kvm_pcpu.c:          { .n_name = "___start_" DPCPU_SETNAME },
lib/libkvm/kvm_pcpu.c:          { .n_name = "___stop_" DPCPU_SETNAME },
lib/libkvm/kvm_pcpu.c:          { .n_name = "_dpcpu_off" },
lib/libkvm/kvm_pcpu.c:          { .n_name = "_mp_maxcpus" },
lib/libkvm/kvm_proc.c:          nl[0].n_name = "_nprocs";
lib/libkvm/kvm_proc.c:          nl[1].n_name = "_allproc";
lib/libkvm/kvm_proc.c:          nl[2].n_name = "_ticks";
lib/libkvm/kvm_proc.c:          nl[3].n_name = "_hz";
lib/libkvm/kvm_proc.c:          nl[4].n_name = "_cpu_tick_frequency";
lib/libkvm/kvm_proc.c:          nlz[0].n_name = "_zombproc";
lib/libkvm/kvm_vnet.c:          { .n_name = "___start_" VNET_SETNAME },
lib/libkvm/kvm_vnet.c:          { .n_name = "___stop_" VNET_SETNAME },
lib/libmemstat/memstat_malloc.c:        { .n_name = "_kmemstatistics" },
lib/libmemstat/memstat_malloc.c:        { .n_name = "_kmemzones" },
lib/libmemstat/memstat_malloc.c:        { .n_name = "_numzones" },
lib/libmemstat/memstat_malloc.c:        { .n_name = "_vm_malloc_zone_count" },
lib/libmemstat/memstat_malloc.c:        { .n_name = "_mp_maxcpus" },
lib/libmemstat/memstat_uma.c:   { .n_name = "_uma_kegs" },
lib/libmemstat/memstat_uma.c:   { .n_name = "_mp_maxid" },
lib/libmemstat/memstat_uma.c:   { .n_name = "_all_cpus" },
lib/libmemstat/memstat_uma.c:   { .n_name = "_vm_ndomains" },
sbin/ddb/ddb_capture.c: { .n_name = "_db_capture_buf" },
sbin/ddb/ddb_capture.c: { .n_name = "_db_capture_bufsize" },
sbin/ddb/ddb_capture.c: { .n_name = "_db_capture_maxbufsize" },
sbin/ddb/ddb_capture.c: { .n_name = "_db_capture_bufoff" },
sbin/ddb/ddb_capture.c: { .n_name = "_db_capture_inprogress" },
tools/tools/ifpifa/ifpifa.c:        { .n_name = "_ifnet", },
tools/tools/umastat/umastat.c:  { .n_name = "_uma_kegs" },
tools/tools/umastat/umastat.c:  { .n_name = "_mp_maxcpus" },
tools/tools/umastat/umastat.c:  { .n_name = "_mp_maxid" },
tools/tools/umastat/umastat.c:  { .n_name = "_all_cpus" },
usr.bin/ktrdump/ktrdump.c:      { .n_name = "_ktr_version" },
usr.bin/ktrdump/ktrdump.c:      { .n_name = "_ktr_entries" },
usr.bin/ktrdump/ktrdump.c:      { .n_name = "_ktr_idx" },
usr.bin/ktrdump/ktrdump.c:      { .n_name = "_ktr_buf" },
usr.bin/vmstat/vmstat.c:        [X_SUM] = { .n_name = "_vm_cnt", },
usr.bin/vmstat/vmstat.c:        [X_HZ] = { .n_name = "_hz", },
usr.bin/vmstat/vmstat.c:        [X_STATHZ] = { .n_name = "_stathz", },
usr.bin/vmstat/vmstat.c:        [X_NCHSTATS] = { .n_name = "_nchstats", },
usr.bin/vmstat/vmstat.c:        [X_INTRNAMES] = { .n_name = "_intrnames", },
usr.bin/vmstat/vmstat.c:        [X_SINTRNAMES] = { .n_name = "_sintrnames", },
usr.bin/vmstat/vmstat.c:        [X_INTRCNT] = { .n_name = "_intrcnt", },
usr.bin/vmstat/vmstat.c:        [X_SINTRCNT] = { .n_name = "_sintrcnt", },
usr.bin/vmstat/vmstat.c:        [X_NINTRCNT] = { .n_name = "_nintrcnt", },
usr.sbin/iostat/iostat.c:       { .n_name = "_tty_nin",
usr.sbin/iostat/iostat.c:       { .n_name = "_tty_nout",
usr.sbin/iostat/iostat.c:       { .n_name = "_boottime",

Would you rather revert the underscore change or fix all these?

-- 
John Baldwin