NetBSD-Bugs archive
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]
kern/60554: nfs: integer shift UB in pathconf(_PC_FILESIZEBITS)
>Number: 60554
>Category: kern
>Synopsis: nfs: integer shift UB in pathconf(_PC_FILESIZEBITS)
>Confidential: no
>Severity: serious
>Priority: medium
>Responsible: kern-bug-people
>State: open
>Class: sw-bug
>Submitter-Id: net
>Arrival-Date: Fri Aug 07 22:20:00 +0000 2026
>Originator: Taylor R Campbell
>Release: current, 11, 10, 9, ...
>Organization:
The NfsBSD Infinite Loop, Inc.
>Environment:
>Description:
When nmp->nm_maxfilesize is 64 bits long, this logic to compute
ilog2(nmp->nm_maxfilesize) overflows the shift into undefined
behaviour:
3226 for (l = 0, maxsize = nmp->nm_maxfilesize;
3227 (maxsize >> l) > 0; l++)
3228 ;
https://nxr.netbsd.org/xref/src/sys/nfs/nfs_vnops.c?r=1.327#3218
This can be provoked by an nfs server that returns a large
maxfilesize in the FSINFO request.
>How-To-Repeat:
1. Set up an NFS server with maxfilesize = 2^64 - 1 (e.g.,
FreeBSD serving from ZFS).
2. Mount it on NetBSD.
3. Run `getconf GETFILESIZEBITS /mnt'.
>Fix:
Use ilog2(maxsize) instead of the bespoke loop, taking care to
handle the fencepost error required by definition of
_PC_FILESIZEBITS:
_PC_FILESIZEBITS
If the maximum size file that could ever exist on the mounted
file system is maxsize, then the returned value is 2 plus the
floor of the base 2 logarithm of maxsize.
Home |
Main Index |
Thread Index |
Old Index