From 0b7c1630c08737458231ab3f63b932a9051ac035 Mon Sep 17 00:00:00 2001 From: Michal Bloch Date: Fri, 3 Apr 2020 19:12:57 +0200 Subject: [PATCH] libdlogutil: leak safety Change-Id: I9c18dfa4c0ba91b98e50ff5f43f111baa332680b Signed-off-by: Michal Bloch --- src/libdlogutil/fd_info.c | 3 +-- src/libdlogutil/logretrieve.c | 11 ++++++++--- src/tests/logutil.c | 2 +- 3 files changed, 10 insertions(+), 6 deletions(-) diff --git a/src/libdlogutil/fd_info.c b/src/libdlogutil/fd_info.c index f23e83c..b4c0014 100644 --- a/src/libdlogutil/fd_info.c +++ b/src/libdlogutil/fd_info.c @@ -82,8 +82,7 @@ int fdi_push_log(struct fd_info *fdi, struct sort_vector *logs, dlogutil_entry_s assert(logs); assert(filter); assert(entry_out); - - *entry_out = NULL; + assert(!*entry_out); dlogutil_entry_s *temp = fdi->ops->extract_entry(fdi); if (!temp) diff --git a/src/libdlogutil/logretrieve.c b/src/libdlogutil/logretrieve.c index d9efd9f..1ea38ec 100644 --- a/src/libdlogutil/logretrieve.c +++ b/src/libdlogutil/logretrieve.c @@ -144,8 +144,8 @@ int put_logs_into_vector(struct fd_info **data_fds, int fd_count, struct sort_ve assert(logs); assert(filter); assert(entry_out); + assert(!*entry_out); - *entry_out = NULL; struct fd_info *best_fdi; do { best_fdi = find_earliest_log(data_fds, fd_count, logs->sort_by); @@ -243,6 +243,8 @@ int dlogutil_state_init(dlogutil_state_s *state, struct fd_info ***data_fds_ptr, static bool flush_single_log(dlogutil_state_s *state, dlogutil_entry_s **out) { + assert(!*out); + if (state->flush_target >= LONG_MAX || sort_vector_empty(&state->logs)) return false; @@ -259,6 +261,8 @@ static bool flush_single_log(dlogutil_state_s *state, dlogutil_entry_s **out) static bool handle_flush(dlogutil_state_s *state, dlogutil_entry_s **out) { + assert(!*out); + bool const r = flush_single_log(state, out); if (!r) state->flush_target = LONG_MAX; @@ -351,7 +355,8 @@ static void set_flush_target(dlogutil_state_s *state, bool all_buffers_empty) */ int do_print_once(dlogutil_state_s *state, int timeout, dlogutil_entry_s **out) { - *out = NULL; + assert(!*out); + while (state->epoll_cnt > 0) { if (handle_flush(state, out)) return 0; @@ -400,7 +405,7 @@ int do_print_once(dlogutil_state_s *state, int timeout, dlogutil_entry_s **out) int do_print(dlogutil_state_s *state, dlogutil_entry_cb callback, void *userdata) { while (true) { - dlogutil_entry_s *out; + dlogutil_entry_s *out = NULL; int r; do r = do_print_once(state, DEFAULT_EPOLL_TIMEOUT, &out); diff --git a/src/tests/logutil.c b/src/tests/logutil.c index 66d20db..17c7b4a 100644 --- a/src/tests/logutil.c +++ b/src/tests/logutil.c @@ -143,7 +143,7 @@ int main() while (!sort_vector_empty(&sv)) sort_vector_pop(&sv); - dlogutil_entry_s *vector_overflown; + dlogutil_entry_s *vector_overflown = NULL; assert(put_logs_into_vector(fds, 0, &sv, (dlogutil_filter_options_s *)0xEEE, &vector_overflown) == 1); assert(!vector_overflown); -- 2.7.4