diff options
author | Kent Overstreet <kent.overstreet@linux.dev> | 2025-05-25 17:05:55 -0400 |
---|---|---|
committer | Kent Overstreet <kent.overstreet@linux.dev> | 2025-05-25 17:05:55 -0400 |
commit | 241bcd01833274da114b709d2f2b13d4429c7fd9 (patch) | |
tree | 3d89ff4bef505134ab5c51a9f3319c03295ced50 | |
parent | fa0a54c45c44e8ff3885ccc72a43fd2d96e01b14 (diff) |
Fix infinite loop in cmd_list_journal
list_journal can print the entire contents of the journal, and non-dirty
entries don't get validated, so we have to account for that.
Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>
-rw-r--r-- | c_src/cmd_list_journal.c | 23 | ||||
-rw-r--r-- | libbcachefs/journal_io.c | 3 |
2 files changed, 20 insertions, 6 deletions
diff --git a/c_src/cmd_list_journal.c b/c_src/cmd_list_journal.c index fe9e3bbd..7b0008de 100644 --- a/c_src/cmd_list_journal.c +++ b/c_src/cmd_list_journal.c @@ -90,9 +90,13 @@ static bool entry_matches_transaction_filter(struct jset_entry *entry, if (!entry->level && (entry->type == BCH_JSET_ENTRY_btree_keys || entry->type == BCH_JSET_ENTRY_overwrite)) - jset_entry_for_each_key(entry, k) + jset_entry_for_each_key(entry, k) { + if (!k->k.u64s) + break; + if (bkey_matches_filter(filter, entry, k)) return true; + } return false; } @@ -105,10 +109,13 @@ static bool should_print_transaction(struct jset_entry *entry, struct jset_entry bool have_log_messages = false; bool have_non_log_messages = false; - darray_for_each(msg_filter, i) - if (!strncmp(*i, l->d, b)) - return false; - + if (msg_filter.nr) { + darray_for_each(msg_filter, i) + if (!strncmp(*i, l->d, b)) + goto found; + return false; + } +found: if (!key_filter.nr) return true; @@ -140,10 +147,14 @@ static bool should_print_entry(struct jset_entry *entry, d_btree_id filter) entry->type != BCH_JSET_ENTRY_overwrite) return true; - jset_entry_for_each_key(entry, k) + jset_entry_for_each_key(entry, k) { + if (!k->k.u64s) + break; + darray_for_each(filter, id) if (entry->btree_id == *id) return true; + } return false; } diff --git a/libbcachefs/journal_io.c b/libbcachefs/journal_io.c index 06f7b018..82205376 100644 --- a/libbcachefs/journal_io.c +++ b/libbcachefs/journal_io.c @@ -418,6 +418,9 @@ static void journal_entry_btree_keys_to_text(struct printbuf *out, struct bch_fs bool first = true; jset_entry_for_each_key(entry, k) { + if (!k->k.u64s) + break; + if (!first) { prt_newline(out); bch2_prt_jset_entry_type(out, entry->type); |