untrusted comment: signature from openbsd 6.0 base secret key
RWSho3oKSqgLQwi8ADWKm5MD49usniTW+3acahh4QRbBhir2p4OjstAS3G83AzLDhR9Oe//OJzpFMU7vNC81lVROFYgQGUWSFwQ=

OpenBSD 6.0 errata 031, August 3, 2017:

An out-of-bound read in vfs_getcwd_scandir() (mainly used for FUSE)
may result in a kernel panic or info leak.

Apply by doing:
   signify -Vep /etc/signify/openbsd-60-base.pub -x 031_fuse.patch.sig \
       -m - | (cd /usr/src && patch -p0)

And then rebuild and install a new kernel:
   cd /usr/src/sys/arch/`machine`/conf
   KK=`sysctl -n kern.osversion | cut -d# -f1`
   config $KK
   cd ../compile/$KK
   make
   make install

Index: sys/kern/vfs_getcwd.c
===================================================================
RCS file: /cvs/src/sys/kern/vfs_getcwd.c,v
--- sys/kern/vfs_getcwd.c       19 Mar 2016 12:04:15 -0000      1.26
+++ sys/kern/vfs_getcwd.c       2 Aug 2017 16:27:05 -0000
@@ -102,18 +102,20 @@ vfs_getcwd_scandir(struct vnode **lvpp,

       /* If we don't care about the pathname, we're done */
       if (bufp == NULL) {
-               vrele(lvp);
-               *lvpp = NULL;
-               return (0);
+               error = 0;
+               goto out;
       }

       fileno = va.va_fileid;

       dirbuflen = DIRBLKSIZ;
-
       if (dirbuflen < va.va_blocksize)
               dirbuflen = va.va_blocksize;
-
+       /* XXX we need some limit for fuse, 1 MB should be enough */
+       if (dirbuflen > 0xfffff) {
+               error = EINVAL;
+               goto out;
+       }
       dirbuf = malloc(dirbuflen, M_TEMP, M_WAITOK);

       off = 0;
@@ -159,15 +161,20 @@ vfs_getcwd_scandir(struct vnode **lvpp,
                       reclen = dp->d_reclen;

                       /* Check for malformed directory */
-                       if (reclen < DIRENT_RECSIZE(1)) {
+                       if (reclen < DIRENT_RECSIZE(1) || reclen > len) {
                               error = EINVAL;
                               goto out;
                       }

                       if (dp->d_fileno == fileno) {
                               char *bp = *bpp;
-                               bp -= dp->d_namlen;

+                               if (offsetof(struct dirent, d_name) +
+                                   dp->d_namlen > reclen) {
+                                       error = EINVAL;
+                                       goto out;
+                               }
+                               bp -= dp->d_namlen;
                               if (bp <= bufp) {
                                       error = ERANGE;
                                       goto out;