From b2e661a328876c05c219b01219e4edab3515e495 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sebastian=20Me=C3=9Fmer?= Date: Thu, 18 Jun 2015 12:47:08 +0200 Subject: [PATCH] Adapt to new blobstore - having unique_ref instead of unique_ptr --- src/CryDevice.cpp | 25 ++++++++++++++++++++----- src/CryDevice.h | 4 ++-- src/CryDir.cpp | 9 ++++++++- src/CryFile.cpp | 12 +++++++++--- src/CryNode.cpp | 4 +++- src/CryNode.h | 2 +- src/CrySymlink.cpp | 7 ++++++- src/impl/DirBlob.cpp | 21 +++++++++++++++++---- src/impl/DirBlob.h | 9 +++++---- src/impl/FileBlob.cpp | 5 +++-- src/impl/FileBlob.h | 7 ++++--- src/impl/SymlinkBlob.cpp | 5 +++-- src/impl/SymlinkBlob.h | 5 +++-- 13 files changed, 84 insertions(+), 31 deletions(-) diff --git a/src/CryDevice.cpp b/src/CryDevice.cpp index 7a50e141..6c03d193 100644 --- a/src/CryDevice.cpp +++ b/src/CryDevice.cpp @@ -27,6 +27,8 @@ using blockstore::encrypted::AES256_CFB; using blobstore::onblocks::BlobStoreOnBlocks; using blobstore::onblocks::BlobOnBlocks; using blockstore::caching::CachingBlockStore; +using cpputils::unique_ref; +using boost::optional; namespace bf = boost::filesystem; @@ -87,34 +89,47 @@ unique_ptr CryDevice::Load(const bf::path &path) { unique_ptr CryDevice::LoadDirBlob(const bf::path &path) { auto currentBlob = _blobStore->load(_rootKey); + if(!currentBlob) { + //TODO Return correct fuse error + return nullptr; + } for (const bf::path &component : path.relative_path()) { //TODO Check whether the next path component is a dir. // Right now, an assertion in DirBlob constructor will fail if it isn't. // But fuse should rather return the correct error code. - unique_ptr currentDir = make_unique(std::move(currentBlob), this); + unique_ptr currentDir = make_unique(std::move(*currentBlob), this); Key childKey = currentDir->GetChild(component.c_str()).key; currentBlob = _blobStore->load(childKey); + if(!currentBlob) { + //TODO Return correct fuse error + return nullptr; + } } - return make_unique(std::move(currentBlob), this); + return make_unique(std::move(*currentBlob), this); } void CryDevice::statfs(const bf::path &path, struct statvfs *fsstat) { throw FuseErrnoException(ENOTSUP); } -unique_ptr CryDevice::CreateBlob() { +unique_ref CryDevice::CreateBlob() { return _blobStore->create(); } -unique_ptr CryDevice::LoadBlob(const blockstore::Key &key) { +optional> CryDevice::LoadBlob(const blockstore::Key &key) { return _blobStore->load(key); } void CryDevice::RemoveBlob(const blockstore::Key &key) { - _blobStore->remove(_blobStore->load(key)); + auto blob = _blobStore->load(key); + if(blob) { + _blobStore->remove(std::move(*blob)); + } else { + //TODO Log error + } } } diff --git a/src/CryDevice.h b/src/CryDevice.h index 8a56c40e..0865d6a2 100644 --- a/src/CryDevice.h +++ b/src/CryDevice.h @@ -25,8 +25,8 @@ public: void statfs(const boost::filesystem::path &path, struct ::statvfs *fsstat) override; - std::unique_ptr CreateBlob(); - std::unique_ptr LoadBlob(const blockstore::Key &key); + cpputils::unique_ref CreateBlob(); + boost::optional> LoadBlob(const blockstore::Key &key); void RemoveBlob(const blockstore::Key &key); std::unique_ptr Load(const boost::filesystem::path &path) override; diff --git a/src/CryDir.cpp b/src/CryDir.cpp index fc99f3cc..49da7b36 100644 --- a/src/CryDir.cpp +++ b/src/CryDir.cpp @@ -23,6 +23,9 @@ using std::string; using std::vector; using blockstore::Key; +using cpputils::unique_ref; +using boost::optional; +using boost::none; namespace cryfs { @@ -52,8 +55,12 @@ void CryDir::createDir(const string &name, mode_t mode, uid_t uid, gid_t gid) { } unique_ptr CryDir::LoadBlob() const { + auto blob = CryNode::LoadBlob(); + if(blob == none) { + return nullptr; + } //TODO Without const_cast? - return make_unique(CryNode::LoadBlob(), const_cast(device())); + return make_unique(std::move(*blob), const_cast(device())); } unique_ptr> CryDir::children() const { diff --git a/src/CryFile.cpp b/src/CryFile.cpp index f8c4b70f..bc75d2dc 100644 --- a/src/CryFile.cpp +++ b/src/CryFile.cpp @@ -15,6 +15,7 @@ using std::unique_ptr; using std::make_unique; using blockstore::Key; +using boost::none; namespace cryfs { @@ -27,12 +28,17 @@ CryFile::~CryFile() { unique_ptr CryFile::open(int flags) const { auto blob = LoadBlob(); - assert(blob.get() != nullptr); - return make_unique(make_unique(std::move(blob))); + assert(blob != none); + return make_unique(make_unique(std::move(*blob))); } void CryFile::truncate(off_t size) const { - FileBlob(LoadBlob()).resize(size); + auto blob = LoadBlob(); + if (blob == none) { + //TODO Log error + return; + } + FileBlob(std::move(*blob)).resize(size); } fspp::Dir::EntryType CryFile::getType() const { diff --git a/src/CryNode.cpp b/src/CryNode.cpp index a7acd3e8..b12b021a 100644 --- a/src/CryNode.cpp +++ b/src/CryNode.cpp @@ -14,6 +14,8 @@ using std::unique_ptr; using blockstore::Key; using blobstore::Blob; using cpputils::dynamic_pointer_move; +using cpputils::unique_ref; +using boost::optional; //TODO Get rid of this in favor of an exception hierarchy using fspp::fuse::CHECK_RETVAL; @@ -67,7 +69,7 @@ const CryDevice *CryNode::device() const { return _device; } -unique_ptr CryNode::LoadBlob() const { +optional> CryNode::LoadBlob() const { return _device->LoadBlob(_key); } diff --git a/src/CryNode.h b/src/CryNode.h index 56ceba8b..80d0d787 100644 --- a/src/CryNode.h +++ b/src/CryNode.h @@ -27,7 +27,7 @@ protected: CryDevice *device(); const CryDevice *device() const; - std::unique_ptr LoadBlob() const; + boost::optional> LoadBlob() const; virtual fspp::Dir::EntryType getType() const = 0; diff --git a/src/CrySymlink.cpp b/src/CrySymlink.cpp index b74c7f78..076db199 100644 --- a/src/CrySymlink.cpp +++ b/src/CrySymlink.cpp @@ -17,6 +17,7 @@ using std::string; using std::vector; using blockstore::Key; +using boost::none; namespace cryfs { @@ -28,7 +29,11 @@ CrySymlink::~CrySymlink() { } unique_ptr CrySymlink::LoadBlob() const { - return make_unique(CryNode::LoadBlob()); + auto blob = CryNode::LoadBlob(); + if (blob == none) { + return nullptr; + } + return make_unique(std::move(*blob)); } fspp::Dir::EntryType CrySymlink::getType() const { diff --git a/src/impl/DirBlob.cpp b/src/impl/DirBlob.cpp index cb9af99b..c5d67fd5 100644 --- a/src/impl/DirBlob.cpp +++ b/src/impl/DirBlob.cpp @@ -21,11 +21,14 @@ using std::make_pair; using blobstore::Blob; using blockstore::Key; using cpputils::Data; +using cpputils::unique_ref; +using boost::none; namespace cryfs { -DirBlob::DirBlob(unique_ptr blob, CryDevice *device) : +DirBlob::DirBlob(unique_ref blob, CryDevice *device) : _device(device), _blob(std::move(blob)), _entries(), _changed(false) { + //TODO generally everywhere: asserts are bad, because they crash the filesystem. Rather return a fuse error! assert(magicNumber() == MagicNumbers::DIR); _readEntriesFromBlob(); } @@ -39,7 +42,7 @@ void DirBlob::flush() { _blob->flush(); } -unique_ptr DirBlob::InitializeEmptyDir(unique_ptr blob, CryDevice *device) { +unique_ptr DirBlob::InitializeEmptyDir(unique_ref blob, CryDevice *device) { blob->resize(1); unsigned char magicNumber = MagicNumbers::DIR; blob->write(&magicNumber, 0, 1); @@ -204,13 +207,23 @@ void DirBlob::statChild(const Key &key, struct ::stat *result) const { //TODO Handle file access times result->st_mtime = result->st_ctime = result->st_atime = 0; if (child.type == fspp::Dir::EntryType::FILE) { - result->st_size = FileBlob(_device->LoadBlob(key)).size(); + auto blob = _device->LoadBlob(key); + if (blob == none) { + //TODO Log error + } else { + result->st_size = FileBlob(std::move(*blob)).size(); + } } else if (child.type == fspp::Dir::EntryType::DIR) { //TODO Why do dirs have 4096 bytes in size? Does that make sense? result->st_size = 4096; } else if (child.type == fspp::Dir::EntryType::SYMLINK) { //TODO Necessary with fuse or does fuse set this on symlinks anyhow? - result->st_size = SymlinkBlob(_device->LoadBlob(key)).target().native().size(); + auto blob = _device->LoadBlob(key); + if (blob == none) { + //TODO Log error + } else { + result->st_size = SymlinkBlob(std::move(*blob)).target().native().size(); + } } else { assert(false); } diff --git a/src/impl/DirBlob.h b/src/impl/DirBlob.h index bc7c1ce1..143abd8f 100644 --- a/src/impl/DirBlob.h +++ b/src/impl/DirBlob.h @@ -4,8 +4,9 @@ #include #include -#include "messmer/cpp-utils/macros.h" +#include #include +#include #include #include @@ -39,9 +40,9 @@ public: gid_t gid; }; - static std::unique_ptr InitializeEmptyDir(std::unique_ptr blob, CryDevice *device); + static std::unique_ptr InitializeEmptyDir(cpputils::unique_ref blob, CryDevice *device); - DirBlob(std::unique_ptr blob, CryDevice *device); + DirBlob(cpputils::unique_ref blob, CryDevice *device); virtual ~DirBlob(); void AppendChildrenTo(std::vector *result) const; @@ -70,7 +71,7 @@ private: std::vector::iterator _findChild(const blockstore::Key &key); CryDevice *_device; - std::unique_ptr _blob; + cpputils::unique_ref _blob; std::vector _entries; bool _changed; diff --git a/src/impl/FileBlob.cpp b/src/impl/FileBlob.cpp index ff86c39c..fe66843b 100644 --- a/src/impl/FileBlob.cpp +++ b/src/impl/FileBlob.cpp @@ -7,17 +7,18 @@ using std::unique_ptr; using std::make_unique; using blobstore::Blob; +using cpputils::unique_ref; namespace cryfs { -FileBlob::FileBlob(unique_ptr blob) +FileBlob::FileBlob(unique_ref blob) : _blob(std::move(blob)) { } FileBlob::~FileBlob() { } -unique_ptr FileBlob::InitializeEmptyFile(unique_ptr blob) { +unique_ptr FileBlob::InitializeEmptyFile(unique_ref blob) { assert(blob.get() != nullptr); blob->resize(1); unsigned char magicNumber = MagicNumbers::FILE; diff --git a/src/impl/FileBlob.h b/src/impl/FileBlob.h index 0f4c6603..8e30b07a 100644 --- a/src/impl/FileBlob.h +++ b/src/impl/FileBlob.h @@ -3,15 +3,16 @@ #define CRYFS_LIB_IMPL_FILEBLOB_H_ #include +#include #include namespace cryfs { class FileBlob { public: - static std::unique_ptr InitializeEmptyFile(std::unique_ptr blob); + static std::unique_ptr InitializeEmptyFile(cpputils::unique_ref blob); - FileBlob(std::unique_ptr blob); + FileBlob(cpputils::unique_ref blob); virtual ~FileBlob(); ssize_t read(void *target, uint64_t offset, uint64_t count) const; @@ -24,7 +25,7 @@ public: blockstore::Key key() const; private: - std::unique_ptr _blob; + cpputils::unique_ref _blob; unsigned char magicNumber() const; }; diff --git a/src/impl/SymlinkBlob.cpp b/src/impl/SymlinkBlob.cpp index 1dcb7e73..aca639b0 100644 --- a/src/impl/SymlinkBlob.cpp +++ b/src/impl/SymlinkBlob.cpp @@ -8,12 +8,13 @@ using std::unique_ptr; using std::make_unique; using std::string; using blobstore::Blob; +using cpputils::unique_ref; namespace bf = boost::filesystem; namespace cryfs { -SymlinkBlob::SymlinkBlob(unique_ptr blob) +SymlinkBlob::SymlinkBlob(unique_ref blob) : _target(_readTargetFromBlob(*blob)) { } @@ -23,7 +24,7 @@ SymlinkBlob::SymlinkBlob(const bf::path &target) :_target(target) { SymlinkBlob::~SymlinkBlob() { } -unique_ptr SymlinkBlob::InitializeSymlink(unique_ptr blob, const bf::path &target) { +unique_ptr SymlinkBlob::InitializeSymlink(unique_ref blob, const bf::path &target) { assert(blob.get() != nullptr); string targetStr = target.native(); blob->resize(1 + targetStr.size()); diff --git a/src/impl/SymlinkBlob.h b/src/impl/SymlinkBlob.h index 41b29de5..ac88e6a2 100644 --- a/src/impl/SymlinkBlob.h +++ b/src/impl/SymlinkBlob.h @@ -5,14 +5,15 @@ #include #include #include +#include namespace cryfs { class SymlinkBlob { public: - static std::unique_ptr InitializeSymlink(std::unique_ptr blob, const boost::filesystem::path &target); + static std::unique_ptr InitializeSymlink(cpputils::unique_ref blob, const boost::filesystem::path &target); - SymlinkBlob(std::unique_ptr blob); + SymlinkBlob(cpputils::unique_ref blob); SymlinkBlob(const boost::filesystem::path &target); virtual ~SymlinkBlob();