From 9b2634a1e5d2ad7ce8e5bca58a5e793077ebabc0 Mon Sep 17 00:00:00 2001 From: Antonio SJ Musumeci Date: Sat, 29 Feb 2020 16:38:31 -0500 Subject: [PATCH] fix name length calculation for musc --- libfuse/lib/fuse_dirents.c | 24 ++++++++++++++++++++++-- src/fuse_readdir_plus_posix.icpp | 15 ++++++++++++++- src/fuse_readdir_posix.icpp | 15 ++++++++++++++- 3 files changed, 50 insertions(+), 4 deletions(-) diff --git a/libfuse/lib/fuse_dirents.c b/libfuse/lib/fuse_dirents.c index 629c6909..18b3a4d1 100644 --- a/libfuse/lib/fuse_dirents.c +++ b/libfuse/lib/fuse_dirents.c @@ -17,6 +17,26 @@ #define DEFAULT_SIZE (1024 * 16) +static +uint64_t +dirent_exact_namelen(const struct dirent *d_) +{ +#ifdef _D_EXACT_NAMELEN + return _D_EXACT_NAMELEN(d_); +#elif defined _DIRENT_HAVE_D_NAMLEN + return d_->d_namlen; +#else + return strlen(d_->d_name); +#endif +} + +static +uint64_t +dirent_alloc_namelen(const struct dirent *d_) +{ + return (dirent_exact_namelen(d_) + 1); +} + static uint64_t align_uint64_t(uint64_t v_) @@ -251,7 +271,7 @@ fuse_dirents_add(fuse_dirents_t *d_, return -EINVAL; } - namelen = _D_ALLOC_NAMLEN(dirent_); + namelen = dirent_alloc_namelen(dirent_); size = fuse_dirent_size(namelen); d = fuse_dirents_alloc(d_,size); @@ -288,7 +308,7 @@ fuse_dirents_add_plus(fuse_dirents_t *d_, break; } - namelen = _D_ALLOC_NAMLEN(dirent_); + namelen = dirent_alloc_namelen(dirent_); size = fuse_direntplus_size(namelen); d = fuse_dirents_alloc(d_,size); diff --git a/src/fuse_readdir_plus_posix.icpp b/src/fuse_readdir_plus_posix.icpp index 966dec4d..4c9ebbf1 100644 --- a/src/fuse_readdir_plus_posix.icpp +++ b/src/fuse_readdir_plus_posix.icpp @@ -45,6 +45,19 @@ using std::vector; namespace l { + static + uint64_t + dirent_exact_namelen(const struct dirent *d_) + { +#ifdef _D_EXACT_NAMELEN + return _D_EXACT_NAMELEN(d_); +#elif defined _DIRENT_HAVE_D_NAMLEN + return d_->d_namlen; +#else + return strlen(d_->d_name); +#endif + } + static int readdir_plus(const Branches &branches_, @@ -83,7 +96,7 @@ namespace l rv = 0; for(struct dirent *de = fs::readdir(dh); de && !rv; de = fs::readdir(dh)) { - rv = names.put(de->d_name,_D_EXACT_NAMLEN(de)); + rv = names.put(de->d_name,l::dirent_exact_namelen(de)); if(rv == 0) continue; diff --git a/src/fuse_readdir_posix.icpp b/src/fuse_readdir_posix.icpp index 4360297b..a653f9eb 100644 --- a/src/fuse_readdir_posix.icpp +++ b/src/fuse_readdir_posix.icpp @@ -44,6 +44,19 @@ using std::vector; namespace l { + static + uint64_t + dirent_exact_namelen(const struct dirent *d_) + { +#ifdef _D_EXACT_NAMELEN + return _D_EXACT_NAMELEN(d_); +#elif defined _DIRENT_HAVE_D_NAMLEN + return d_->d_namlen; +#else + return strlen(d_->d_name); +#endif + } + static int readdir(const Branches &branches_, @@ -74,7 +87,7 @@ namespace l rv = 0; for(struct dirent *de = fs::readdir(dh); de && !rv; de = fs::readdir(dh)) { - rv = names.put(de->d_name,_D_EXACT_NAMLEN(de)); + rv = names.put(de->d_name,l::dirent_exact_namelen(de)); if(rv == 0) continue;