diff options
Diffstat (limited to 'src/osd/modules/file/posixfile.cpp')
-rw-r--r-- | src/osd/modules/file/posixfile.cpp | 14 |
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); |