From c0f860c9460cf084f9fbd3bd3635c06e839bcabb Mon Sep 17 00:00:00 2001 From: Eric Fiselier Date: Thu, 29 Sep 2016 01:01:26 +0000 Subject: [PATCH] Partially revert overflow checking in last_write_time git-svn-id: https://llvm.org/svn/llvm-project/libcxx/trunk@282660 91177308-0d34-0410-b5e6-96231b3b80d8 --- src/experimental/filesystem/operations.cpp | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/src/experimental/filesystem/operations.cpp b/src/experimental/filesystem/operations.cpp index 2eb05076b..6073d3a1b 100644 --- a/src/experimental/filesystem/operations.cpp +++ b/src/experimental/filesystem/operations.cpp @@ -544,16 +544,14 @@ file_time_type __last_write_time(const path& p, std::error_code *ec) set_or_throw(m_ec, ec, "last_write_time", p); return file_time_type::min(); } + if (ec) ec->clear(); + auto ts = detail::extract_mtime(st); #ifndef _LIBCPP_HAS_NO_INT128 using IntMax = __int128_t; -#else - using IntMax = intmax_t; -#endif // FIXME: The value may not be representable as file_time_type. Fix // file_time_type so it can represent all possible values returned by the // filesystem. For now we do the calculation with the largest possible types // and then truncate, this prevents signed integer overflow bugs. - auto ts = detail::extract_mtime(st); const auto NsDur = duration(ts.tv_nsec) + seconds(ts.tv_sec); if (NsDur > file_time_type::max().time_since_epoch() || NsDur < file_time_type::min().time_since_epoch()) { @@ -561,8 +559,12 @@ file_time_type __last_write_time(const path& p, std::error_code *ec) "last_write_time", p); return file_time_type::min(); } - if (ec) ec->clear(); return file_time_type(duration_cast(NsDur)); +#else + // FIXME the under/overflow check done above overflows if we don't have + // a 128 bit integer type. + return file_time_type::clock::from_time_t(ts.tv_sec); +#endif } void __last_write_time(const path& p, file_time_type new_time,