summaryrefslogtreecommitdiffstatshomepage
path: root/src/osd/modules/file/posixfile.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/osd/modules/file/posixfile.cpp')
-rw-r--r--src/osd/modules/file/posixfile.cpp14
1 files changed, 9 insertions, 5 deletions
diff --git a/src/osd/modules/file/posixfile.cpp b/src/osd/modules/file/posixfile.cpp
index c5ce8bf7b4e..8aebde2adc2 100644
--- a/src/osd/modules/file/posixfile.cpp
+++ b/src/osd/modules/file/posixfile.cpp
@@ -380,13 +380,17 @@ std::unique_ptr<osd::directory::entry> osd_stat(const std::string &path)
// create an osd_directory_entry; be sure to make sure that the caller can
// free all resources by just freeing the resulting osd_directory_entry
- osd::directory::entry *result;
- try { result = reinterpret_cast<osd::directory::entry *>(::operator new(sizeof(*result) + path.length() + 1)); }
- catch (...) { return nullptr; }
+ auto const result = reinterpret_cast<osd::directory::entry *>(
+ ::operator new(
+ sizeof(osd::directory::entry) + path.length() + 1,
+ std::align_val_t(alignof(osd::directory::entry)),
+ std::nothrow));
+ if (!result) return nullptr;
new (result) osd::directory::entry;
- std::strcpy(reinterpret_cast<char *>(result) + sizeof(*result), path.c_str());
- result->name = reinterpret_cast<char *>(result) + sizeof(*result);
+ auto const resultname = reinterpret_cast<char *>(result) + sizeof(*result);
+ std::strcpy(resultname, path.c_str());
+ result->name = resultname;
result->type = S_ISDIR(st.st_mode) ? osd::directory::entry::entry_type::DIR : osd::directory::entry::entry_type::FILE;
result->size = std::uint64_t(std::make_unsigned_t<decltype(st.st_size)>(st.st_size));
result->last_modified = std::chrono::system_clock::from_time_t(st.st_mtime);