bootlog: fix dangling pointer problem in logger_build_boot (#19942)

* fix  dangling pointer problem

* logger_build_init_data() has same problem

* return kj::Array<capnp::byte>

* Revert "return kj::Array<capnp::byte>"

This reverts commit 4df4685bfc.

* Empty commit,trigger Build

* fix each segment in a route having a different initial logMonoTime
old-commit-hash: 79e05965c4
commatwo_master
Dean Lee 5 years ago committed by GitHub
parent c221eff09c
commit b0552a1985
  1. 13
      selfdrive/loggerd/bootlog.cc
  2. 16
      selfdrive/loggerd/logger.cc
  3. 5
      selfdrive/loggerd/logger.h
  4. 2
      selfdrive/loggerd/loggerd.cc

@ -22,13 +22,6 @@ int main(int argc, char** argv) {
std::string path = LOG_ROOT + "/boot/" + std::string(filename);
LOGW("bootlog to %s", path.c_str());
MessageBuilder boot_msg;
logger_build_boot(boot_msg);
MessageBuilder init_msg;
logger_build_init_data(init_msg);
// Open bootlog
int r = logger_mkpath((char*)path.c_str());
assert(r == 0);
@ -42,12 +35,14 @@ int main(int argc, char** argv) {
assert(bzerror == BZ_OK);
// Write initdata
auto bytes = init_msg.toBytes();
kj::Array<capnp::word> init_msg = logger_build_init_data();
auto bytes = init_msg.asBytes();
BZ2_bzWrite(&bzerror, bz_file, bytes.begin(), bytes.size());
assert(bzerror == BZ_OK);
// Write bootlog
bytes = boot_msg.toBytes();
kj::Array<capnp::word> boot_msg = logger_build_boot();
bytes = boot_msg.asBytes();
BZ2_bzWrite(&bzerror, bz_file, bytes.begin(), bytes.size());
assert(bzerror == BZ_OK);

@ -52,7 +52,8 @@ int logger_mkpath(char* file_path) {
}
// ***** log metadata *****
void logger_build_boot(MessageBuilder &msg) {
kj::Array<capnp::word> logger_build_boot() {
MessageBuilder msg;
auto boot = msg.initEvent().initBoot();
boot.setWallTimeNanos(nanos_since_epoch());
@ -65,9 +66,11 @@ void logger_build_boot(MessageBuilder &msg) {
std::string launchLog = util::read_file("/tmp/launch_log");
boot.setLaunchLog(capnp::Text::Reader(launchLog.data(), launchLog.size()));
return capnp::messageToFlatArray(msg);
}
void logger_build_init_data(MessageBuilder &msg) {
kj::Array<capnp::word> logger_build_init_data() {
MessageBuilder msg;
auto init = msg.initEvent().initInitData();
if (util::file_exists("/EON")) {
@ -132,12 +135,11 @@ void logger_build_init_data(MessageBuilder &msg) {
i++;
}
}
return capnp::messageToFlatArray(msg);
}
void log_init_data(LoggerState *s) {
MessageBuilder msg;
logger_build_init_data(msg);
auto bytes = msg.toBytes();
auto bytes = s->init_data.asBytes();
logger_log(s, bytes.begin(), bytes.size(), s->has_qlog);
}
@ -154,8 +156,6 @@ static void log_sentinel(LoggerState *s, cereal::Sentinel::SentinelType type) {
// ***** logging functions *****
void logger_init(LoggerState *s, const char* log_name, bool has_qlog) {
memset(s, 0, sizeof(*s));
umask(0);
pthread_mutex_init(&s->lock, NULL);
@ -170,6 +170,8 @@ void logger_init(LoggerState *s, const char* log_name, bool has_qlog) {
strftime(s->route_name, sizeof(s->route_name),
"%Y-%m-%d--%H-%M-%S", &timeinfo);
snprintf(s->log_name, sizeof(s->log_name), "%s", log_name);
s->init_data = logger_build_init_data();
}
static LoggerHandle* logger_open(LoggerState *s, const char* root_path) {

@ -32,6 +32,7 @@ typedef struct LoggerHandle {
typedef struct LoggerState {
pthread_mutex_t lock;
int part;
kj::Array<capnp::word> init_data;
char route_name[64];
char log_name[64];
bool has_qlog;
@ -41,8 +42,8 @@ typedef struct LoggerState {
} LoggerState;
int logger_mkpath(char* file_path);
void logger_build_boot(MessageBuilder &msg);
void logger_build_init_data(MessageBuilder &msg);
kj::Array<capnp::word> logger_build_boot();
kj::Array<capnp::word> logger_build_init_data();
void logger_init(LoggerState *s, const char* log_name, bool has_qlog);
int logger_next(LoggerState *s, const char* root_path,
char* out_segment_path, size_t out_segment_path_len,

@ -161,7 +161,7 @@ private:
struct LoggerdState {
Context *ctx;
LoggerState logger;
LoggerState logger = {};
char segment_path[4096];
int rotate_segment;
pthread_mutex_t rotate_lock;

Loading…
Cancel
Save