From: Kevin <kev...@ya...> - 2009-01-13 01:04:14
|
Miklos, a question on the following function. in this test: if (!dirent->namelen || dirent->namelen > FUSE_NAME_MAX) { return -EIO; } my understanding is that the memory is allocated by pages, i.e. buf is allocated by page and the user land might not fill the buf completely so there could be garbage at the end of the page. (the user land memory is allocated by the multiple of 4k i think). why does it return EIO here? it could be perfectly fine if the directory content doesn't fill the full page. static int parse_dirfile(char *buf, size_t nbytes, struct file *file, void *dstbuf, filldir_t filldir) { while (nbytes >= FUSE_NAME_OFFSET) { struct fuse_dirent *dirent = (struct fuse_dirent *) buf; size_t reclen = FUSE_DIRENT_SIZE(dirent); int over; if (!dirent->namelen || dirent->namelen > FUSE_NAME_MAX) { return -EIO; } if (reclen > nbytes) break; over = filldir(dstbuf, dirent->name, dirent->namelen, file->f_pos, dirent->ino, dirent->type); if (over) break; buf += reclen; nbytes -= reclen; file->f_pos = dirent->off; } return 0; } |