untrusted comment: verify with openbsd-78-base.pub RWS3/nvFmk4SWQ1Kh5wuevg1/w7iwcHr3jl1FFtHWEnhHW48y9EarFET7IzDqe+jk4wXCds2He7RSs/dXIHRDeY/nR176b5YWQ8= OpenBSD 7.8 errata 035, May 8, 2026: Due to insufficient checks in NFS server, the kernel could crash. Apply by doing: signify -Vep /etc/signify/openbsd-78-base.pub -x 035_nfs.patch.sig \ -m - | (cd /usr/src && patch -p0) And then rebuild and install a new kernel: KK=`sysctl -n kern.osversion | cut -d# -f1` cd /usr/src/sys/arch/`machine`/compile/$KK make obj make config make make install Index: sys/nfs/nfs_serv.c =================================================================== RCS file: /cvs/src/sys/nfs/nfs_serv.c,v diff -u -p -u -r1.132 nfs_serv.c --- sys/nfs/nfs_serv.c 30 Apr 2025 18:38:20 -0000 1.132 +++ sys/nfs/nfs_serv.c 5 May 2026 09:08:55 -0000 @@ -2427,17 +2427,24 @@ nfsrv_readdir(struct nfsrv_descript *nfs } off = toff; cnt = fxdr_unsigned(int, *tl); - xfer = NFS_SRVMAXDATA(nfsd); - if (cnt > xfer || cnt < 0) - cnt = xfer; - siz = ((cnt + DIRBLKSIZ - 1) & ~(DIRBLKSIZ - 1)); - if (siz > xfer) - siz = xfer; - fullsiz = siz; - error = nfsrv_fhtovp(fhp, 1, &vp, cred, slp, nam, &rdonly); - if (!error && vp->v_type != VDIR) { - error = ENOTDIR; - vput(vp); + if (cnt == 0) { + if (info.nmi_v3) + error = NFSERR_TOOSMALL; + else + error = EBADRPC; + } else { + xfer = NFS_SRVMAXDATA(nfsd); + if (cnt > xfer || cnt < 0) + cnt = xfer; + siz = ((cnt + DIRBLKSIZ - 1) & ~(DIRBLKSIZ - 1)); + if (siz > xfer || siz <= 0) + siz = xfer; + fullsiz = siz; + error = nfsrv_fhtovp(fhp, 1, &vp, cred, slp, nam, &rdonly); + if (!error && vp->v_type != VDIR) { + error = ENOTDIR; + vput(vp); + } } if (error) { if (nfsm_reply(&info, nfsd, slp, mrq, error, @@ -2649,17 +2656,21 @@ nfsrv_readdirplus(struct nfsrv_descript tl += 2; siz = fxdr_unsigned(int, *tl++); cnt = fxdr_unsigned(int, *tl); - xfer = NFS_SRVMAXDATA(nfsd); - if (cnt > xfer || cnt < 0) - cnt = xfer; - siz = ((siz + DIRBLKSIZ - 1) & ~(DIRBLKSIZ - 1)); - if (siz > xfer) - siz = xfer; - fullsiz = siz; - error = nfsrv_fhtovp(fhp, 1, &vp, cred, slp, nam, &rdonly); - if (!error && vp->v_type != VDIR) { - error = ENOTDIR; - vput(vp); + if (siz == 0 || cnt == 0) { + error = NFSERR_TOOSMALL; + } else { + xfer = NFS_SRVMAXDATA(nfsd); + if (cnt > xfer || cnt < 0) + cnt = xfer; + siz = ((siz + DIRBLKSIZ - 1) & ~(DIRBLKSIZ - 1)); + if (siz > xfer || siz <= 0) + siz = xfer; + fullsiz = siz; + error = nfsrv_fhtovp(fhp, 1, &vp, cred, slp, nam, &rdonly); + if (!error && vp->v_type != VDIR) { + error = ENOTDIR; + vput(vp); + } } if (error) { if (nfsm_reply(&info, nfsd, slp, mrq, error,