Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 9 Dec 2014 22:41:30 -0500 (EST)
From:      Rick Macklem <rmacklem@uoguelph.ca>
To:        FreeBSD Filesystems <freebsd-fs@freebsd.org>
Cc:        George Neville-Neil <gnn@freebsd.org>
Subject:   fuse dirent bug???
Message-ID:  <156074187.8997064.1418182890206.JavaMail.root@uoguelph.ca>

next in thread | raw e-mail | index | archive | help
Hi,

While looking at the fuse code to change it to use a new
"struct dirent", I spotted this line, which doesn't look
correct.

Line 358 of sys/fs/fuse/fuse_internal.c:
        ((char *)cookediov->base)[bytesavail] = '\0';
- I think this is intended to null terminate the name,
  since it comes right after the memcpy() of the file name.
However, bytesavail is the value returned by GENERIC_DIRSIZ(),
which means [bytesavail] after "cookediov->base" would be the
first byte after the "struct dirent" (including the space for
null termination and padding.

If I'm correct, I think this line can be replaced by:
        de->d_name[fudge->namelen] = '\0';
which would be the byte after the name in the structure.

Also, although I think the first argument to the memcpy() call
just above this is correct, it is complex/convoluted.
Wouldn't just writing "memcpy(de->d_name, ..." make it
more readable?

Anyone out there familiar with fuse able to look at/test this?

Thanks, rick



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?156074187.8997064.1418182890206.JavaMail.root>