From b57ccf351703c7edd041c8bea91b2e68e3ca7d0d Mon Sep 17 00:00:00 2001 From: Johannes Schlatow Date: Thu, 17 Feb 2022 12:06:12 +0100 Subject: [PATCH] trace_buffer: fix wrap corner case If the functor reading the first entry after wrap-around returned false, the wrapping was not applied successfully. genodelabs/genode#4430 --- repos/base/include/base/trace/buffer.h | 2 ++ repos/os/include/trace/trace_buffer.h | 7 ++++++- 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/repos/base/include/base/trace/buffer.h b/repos/base/include/base/trace/buffer.h index 25d7c875f1..439d672b1d 100644 --- a/repos/base/include/base/trace/buffer.h +++ b/repos/base/include/base/trace/buffer.h @@ -124,6 +124,8 @@ class Genode::Trace::Buffer public: + Entry() : _entry(0) { }; + size_t length() const { return _entry->len; } char const *data() const { return _entry->data; } diff --git a/repos/os/include/trace/trace_buffer.h b/repos/os/include/trace/trace_buffer.h index cfc6dab8d8..06349ea1e9 100644 --- a/repos/os/include/trace/trace_buffer.h +++ b/repos/os/include/trace/trace_buffer.h @@ -76,8 +76,10 @@ class Trace_buffer /* iterate over all entries that were not processed yet */ for (; wrapped || !entry.last(); entry = _buffer.next(entry)) { /* if buffer wrapped, we pass the last entry once and continue at first entry */ + bool applied_wrap = false; if (wrapped && entry.last()) { wrapped = false; + applied_wrap = true; entry = _buffer.first(); if (entry.last()) { new_curr = entry; @@ -89,8 +91,11 @@ class Trace_buffer continue; } - if (!functor(entry)) + if (!functor(entry)) { + if (applied_wrap) + new_curr = Trace::Buffer::Entry(); break; + } new_curr = entry; }