Browse Source

Fixup listxattr error handling

fixes
Antonio SJ Musumeci 6 days ago
parent
commit
be99dffc85
  1. 38
      src/fuse_listxattr.cpp

38
src/fuse_listxattr.cpp

@ -26,7 +26,6 @@
#include "fuse.h" #include "fuse.h"
#include <filesystem> #include <filesystem>
#include <optional>
#include <string> #include <string>
#include <cstring> #include <cstring>
@ -37,12 +36,16 @@ _listxattr_size(const std::vector<Branch*> &branches_,
const fs::path &fusepath_) const fs::path &fusepath_)
{ {
ssize_t size; ssize_t size;
ssize_t err;
bool success;
fs::path fullpath; fs::path fullpath;
if(branches_.empty()) if(branches_.empty())
return -ENOENT; return -ENOENT;
size = 0;
size = 0;
err = -ENOENT;
success = false;
for(const auto branch : branches_) for(const auto branch : branches_)
{ {
ssize_t rv; ssize_t rv;
@ -51,11 +54,19 @@ _listxattr_size(const std::vector<Branch*> &branches_,
rv = fs::llistxattr(fullpath,NULL,0); rv = fs::llistxattr(fullpath,NULL,0);
if(rv < 0) if(rv < 0)
continue;
{
if(err == -ENOENT)
err = rv;
continue;
}
success = true;
size += rv; size += rv;
} }
if(success == false)
return err;
return size; return size;
} }
@ -68,36 +79,39 @@ _listxattr(const std::vector<Branch*> &branches_,
{ {
ssize_t rv; ssize_t rv;
ssize_t size; ssize_t size;
ssize_t err;
bool success;
fs::path fullpath; fs::path fullpath;
std::optional<ssize_t> err;
if(size_ == 0) if(size_ == 0)
return ::_listxattr_size(branches_,fusepath_); return ::_listxattr_size(branches_,fusepath_);
size = 0;
err = -ENOENT;
size = 0;
err = -ENOENT;
success = false;
for(const auto branch : branches_) for(const auto branch : branches_)
{ {
fullpath = branch->path / fusepath_; fullpath = branch->path / fusepath_;
rv = fs::llistxattr(fullpath,list_,size_); rv = fs::llistxattr(fullpath,list_,size_);
if(rv == -ERANGE)
return -ERANGE;
if(rv < 0) if(rv < 0)
{ {
if(!err.has_value())
if(err == -ENOENT)
err = rv; err = rv;
continue; continue;
} }
err = 0;
if((size_t)rv > size_)
return -ERANGE;
success = true;
list_ += rv; list_ += rv;
size_ -= rv; size_ -= rv;
size += rv; size += rv;
} }
if(err < 0)
return err.value();
if(success == false)
return err;
return size; return size;
} }

Loading…
Cancel
Save