Fixed crash in aos when rotating low frequency logs.
The data_writer.writer can be nullptr under some conditions when
restarting the log. This caused a crash when accesing it.
This commit checks to see if data_writer.writer is set before
using it.
Change-Id: Iaf6cb60f728c16819a650d09595cee06a1c95add
Signed-off-by: James Kuszmaul <james.kuszmaul@bluerivertech.com>
diff --git a/aos/events/logging/log_namer.h b/aos/events/logging/log_namer.h
index 8c62559..8d69fbb 100644
--- a/aos/events/logging/log_namer.h
+++ b/aos/events/logging/log_namer.h
@@ -9,6 +9,7 @@
#include "absl/container/btree_map.h"
#include "flatbuffers/flatbuffers.h"
+#include "glog/logging.h"
#include "aos/events/logging/logfile_utils.h"
#include "aos/events/logging/logger_generated.h"
@@ -346,6 +347,7 @@
bool ran_out_of_space() const {
return accumulate_data_writers<bool>(
ran_out_of_space_, [](bool x, const NewDataWriter &data_writer) {
+ CHECK_NOTNULL(data_writer.writer);
return x ||
(data_writer.writer && data_writer.writer->ran_out_of_space());
});
@@ -358,6 +360,7 @@
size_t maximum_total_bytes() const {
return accumulate_data_writers<size_t>(
0, [](size_t x, const NewDataWriter &data_writer) {
+ CHECK_NOTNULL(data_writer.writer);
return std::max(x, data_writer.writer->total_bytes());
});
}
@@ -374,6 +377,7 @@
return accumulate_data_writers(
max_write_time_,
[](std::chrono::nanoseconds x, const NewDataWriter &data_writer) {
+ CHECK_NOTNULL(data_writer.writer);
return std::max(
x, data_writer.writer->WriteStatistics()->max_write_time());
});
@@ -383,6 +387,7 @@
std::make_tuple(max_write_time_bytes_, max_write_time_),
[](std::tuple<int, std::chrono::nanoseconds> x,
const NewDataWriter &data_writer) {
+ CHECK_NOTNULL(data_writer.writer);
if (data_writer.writer->WriteStatistics()->max_write_time() >
std::get<1>(x)) {
return std::make_tuple(
@@ -397,6 +402,7 @@
std::make_tuple(max_write_time_messages_, max_write_time_),
[](std::tuple<int, std::chrono::nanoseconds> x,
const NewDataWriter &data_writer) {
+ CHECK_NOTNULL(data_writer.writer);
if (data_writer.writer->WriteStatistics()->max_write_time() >
std::get<1>(x)) {
return std::make_tuple(
@@ -411,12 +417,14 @@
return accumulate_data_writers(
total_write_time_,
[](std::chrono::nanoseconds x, const NewDataWriter &data_writer) {
+ CHECK_NOTNULL(data_writer.writer);
return x + data_writer.writer->WriteStatistics()->total_write_time();
});
}
int total_write_count() const {
return accumulate_data_writers(
total_write_count_, [](int x, const NewDataWriter &data_writer) {
+ CHECK_NOTNULL(data_writer.writer);
return x + data_writer.writer->WriteStatistics()->total_write_count();
});
}
@@ -430,6 +438,7 @@
int total_write_bytes() const {
return accumulate_data_writers(
total_write_bytes_, [](int x, const NewDataWriter &data_writer) {
+ CHECK_NOTNULL(data_writer.writer);
return x + data_writer.writer->WriteStatistics()->total_write_bytes();
});
}
@@ -463,10 +472,11 @@
T accumulate_data_writers(T t, BinaryOperation op) const {
for (const std::pair<const Channel *const, NewDataWriter> &data_writer :
data_writers_) {
- if (!data_writer.second.writer) continue;
- t = op(std::move(t), data_writer.second);
+ if (data_writer.second.writer != nullptr) {
+ t = op(std::move(t), data_writer.second);
+ }
}
- if (data_writer_) {
+ if (data_writer_ != nullptr && data_writer_->writer != nullptr) {
t = op(std::move(t), *data_writer_);
}
return t;