From de348b0dee542aae2e47a4e418f0ab62b38f6ab1 Mon Sep 17 00:00:00 2001 From: James Stone Date: Fri, 25 Aug 2023 12:26:14 -0700 Subject: [PATCH 1/3] maybe fix a buffer overrun in a test --- src/realm/timestamp.hpp | 5 ++--- src/realm/util/serializer.cpp | 8 ++++---- test/test_json.cpp | 16 ++++++++-------- 3 files changed, 14 insertions(+), 15 deletions(-) diff --git a/src/realm/timestamp.hpp b/src/realm/timestamp.hpp index 28647f26fcf..bc0d2855802 100644 --- a/src/realm/timestamp.hpp +++ b/src/realm/timestamp.hpp @@ -182,8 +182,7 @@ class Timestamp { return size_t(m_seconds) ^ size_t(m_nanoseconds); } - // Buffer must be at least 32 bytes long - const char* to_string(char* buffer) const; + const char* to_string(std::array& buffer) const; template friend std::basic_ostream& operator<<(std::basic_ostream& out, const Timestamp&); @@ -199,7 +198,7 @@ class Timestamp { template inline std::basic_ostream& operator<<(std::basic_ostream& out, const Timestamp& d) { - char buffer[32]; + std::array buffer{}; out << d.to_string(buffer); return out; } diff --git a/src/realm/util/serializer.cpp b/src/realm/util/serializer.cpp index c768fbfdcdc..c32cc2acc8e 100644 --- a/src/realm/util/serializer.cpp +++ b/src/realm/util/serializer.cpp @@ -75,7 +75,7 @@ static void out_dec(char** buffer, unsigned val, int width) static constexpr long epoc_julian_days = date_to_julian(1970, 1, 1); // 2440588 static constexpr int seconds_in_a_day = 24 * 60 * 60; -const char* Timestamp::to_string(char* buffer) const +const char* Timestamp::to_string(std::array& buffer) const { if (is_null()) { return "null"; @@ -106,7 +106,7 @@ const char* Timestamp::to_string(char* buffer) const julian_to_date(julian_days, &year, &month, &day); - char* p = buffer; + char* p = buffer.data(); if (year < 0) { *p++ = '-'; year = -year; @@ -124,9 +124,9 @@ const char* Timestamp::to_string(char* buffer) const out_dec(&p, secs, 2); *p = '\0'; if (nano) { - snprintf(p, 32 - (p - buffer), ".%09d", nano); + snprintf(p, 32 - (p - buffer.data()), ".%09d", nano); } - return buffer; + return buffer.data(); } namespace util { diff --git a/test/test_json.cpp b/test/test_json.cpp index a43bf7f7b9c..16b83ca7aa8 100644 --- a/test/test_json.cpp +++ b/test/test_json.cpp @@ -865,16 +865,16 @@ using namespace std::chrono; TEST(Json_Timestamp) { - char buffer1[31]; - char buffer2[31]; + std::array buffer1{}; + std::array buffer2{}; Timestamp(-63549305085, 0).to_string(buffer1); - CHECK(strcmp(buffer1, "-0044-03-15 15:15:15") == 0); + CHECK(strcmp(buffer1.data(), "-0044-03-15 15:15:15") == 0); Timestamp(0, 0).to_string(buffer1); - CHECK(strcmp(buffer1, "1970-01-01 00:00:00") == 0); + CHECK(strcmp(buffer1.data(), "1970-01-01 00:00:00") == 0); Timestamp(-1, 0).to_string(buffer1); - CHECK(strcmp(buffer1, "1969-12-31 23:59:59") == 0); + CHECK(strcmp(buffer1.data(), "1969-12-31 23:59:59") == 0); Timestamp(-1, -100000000).to_string(buffer1); - CHECK(strcmp(buffer1, "1969-12-31 23:59:58.900000000") == 0); + CHECK(strcmp(buffer1.data(), "1969-12-31 23:59:58.900000000") == 0); // Compare our own to_string with standard implementation // for years 1900 to 2050 @@ -895,8 +895,8 @@ TEST(Json_Timestamp) #else gmtime_r(&seconds, &buf); #endif - strftime(buffer2, sizeof(buffer2), "%Y-%m-%d %H:%M:%S", &buf); - CHECK(strcmp(buffer1, buffer2) == 0); + strftime(buffer2.data(), sizeof(buffer2), "%Y-%m-%d %H:%M:%S", &buf); + CHECK(strcmp(buffer1.data(), buffer2.data()) == 0); } /* auto t1 = steady_clock::now(); From d1a8bd084455ac5dc56fc020a98dbc9740c3032f Mon Sep 17 00:00:00 2001 From: James Stone Date: Fri, 25 Aug 2023 12:44:45 -0700 Subject: [PATCH 2/3] maybe fix a race in async_open_realm test util --- test/object-store/util/sync/sync_test_utils.cpp | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/test/object-store/util/sync/sync_test_utils.cpp b/test/object-store/util/sync/sync_test_utils.cpp index 416c09d9dc1..89000620e20 100644 --- a/test/object-store/util/sync/sync_test_utils.cpp +++ b/test/object-store/util/sync/sync_test_utils.cpp @@ -246,16 +246,20 @@ void async_open_realm(const Realm::Config& config, std::mutex mutex; bool did_finish = false; auto task = Realm::get_synchronized_realm(config); - task->start([&, callback = std::move(finish)](ThreadSafeReference&& ref, std::exception_ptr e) { - callback(std::move(ref), e); + ThreadSafeReference tsr; + std::exception_ptr err = nullptr; + task->start([&](ThreadSafeReference&& ref, std::exception_ptr e) { std::lock_guard lock(mutex); did_finish = true; + tsr = std::move(ref); + err = e; }); util::EventLoop::main().run_until([&] { std::lock_guard lock(mutex); return did_finish; }); task->cancel(); // don't run the above notifier again on this session + finish(std::move(tsr), err); } #endif // REALM_ENABLE_AUTH_TESTS From df608c8ffa868519780755455c1d1179cd147112 Mon Sep 17 00:00:00 2001 From: James Stone Date: Fri, 25 Aug 2023 13:32:03 -0700 Subject: [PATCH 3/3] add array include --- src/realm/timestamp.hpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/realm/timestamp.hpp b/src/realm/timestamp.hpp index bc0d2855802..5e77f2717fe 100644 --- a/src/realm/timestamp.hpp +++ b/src/realm/timestamp.hpp @@ -19,6 +19,7 @@ #ifndef REALM_TIMESTAMP_HPP #define REALM_TIMESTAMP_HPP +#include #include #include #include