From 96823dab7381bcb7a317b32908847a5c4e64b42c Mon Sep 17 00:00:00 2001 From: Arne Welzel Date: Mon, 8 Jan 2024 14:44:08 +0100 Subject: [PATCH] Dict: Invalidate iterators during Clear() If we don't do this, a RobustDictIterator owned by someone else holds dangling pointers to the Dictionary that is being cleared. Closes #3523 --- src/Dict.h | 10 +++++++++- .../Traces/smb/smb_many_open_files_500.pcap.gz | Bin 0 -> 13970 bytes .../btest/core/dict-iteration-expire-3523.zeek | 14 ++++++++++++++ 3 files changed, 23 insertions(+), 1 deletion(-) create mode 100644 testing/btest/Traces/smb/smb_many_open_files_500.pcap.gz create mode 100644 testing/btest/core/dict-iteration-expire-3523.zeek diff --git a/src/Dict.h b/src/Dict.h index c9ebb84a90..c3443a3ddf 100644 --- a/src/Dict.h +++ b/src/Dict.h @@ -382,7 +382,9 @@ public: pointer operator->() { return &curr; } RobustDictIterator& operator++() { - curr = dict->GetNextRobustIteration(this); + if ( dict ) + curr = dict->GetNextRobustIteration(this); + return *this; } @@ -475,6 +477,7 @@ private: inserted = nullptr; visited = nullptr; dict = nullptr; + curr = nullptr; // make this same as robust_end() } } @@ -765,6 +768,11 @@ public: order.reset(); if ( iterators ) { + // Complete() erases from this Dictionary's iterators member, use a copy. + auto copied_iterators = *iterators; + for ( auto* i : copied_iterators ) + i->Complete(); + delete iterators; iterators = nullptr; } diff --git a/testing/btest/Traces/smb/smb_many_open_files_500.pcap.gz b/testing/btest/Traces/smb/smb_many_open_files_500.pcap.gz new file mode 100644 index 0000000000000000000000000000000000000000..574deee82efd52b5ce592d47eacf2b3b54ca1656 GIT binary patch literal 13970 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