Module: check_mk
Branch: master
Commit: 5f43daa6b1c9b5626dfb3b31f4c56c0cefa4c07c
URL:
http://git.mathias-kettner.de/git/?p=check_mk.git;a=commit;h=5f43daa6b1c9b5…
Author: Sven Panne <sp(a)mathias-kettner.de>
Date: Mon Nov 9 08:47:17 2015 +0100
Bug fix: Avoid undefined behavior in freeMessages.
---
livestatus/src/Logfile.cc | 15 ++++++++++-----
1 file changed, 10 insertions(+), 5 deletions(-)
diff --git a/livestatus/src/Logfile.cc b/livestatus/src/Logfile.cc
index 9fafe5f..93baa4c 100644
--- a/livestatus/src/Logfile.cc
+++ b/livestatus/src/Logfile.cc
@@ -170,14 +170,19 @@ void Logfile::loadRange(FILE *file, unsigned missing_types,
long Logfile::freeMessages(unsigned logclasses)
{
long freed = 0;
- for (logfile_entries_t::iterator it = _entries.begin(); it != _entries.end(); ++it)
+ // We have to be careful here: Erasing an element from an associative
+ // container invalidates the iterator pointing to it. The solution is the
+ // usual post-increment idiom, see Scott Meyers' "Effective STL", item
9
+ // ("Choose carefully among erasing options.").
+ for (logfile_entries_t::iterator it = _entries.begin(); it != _entries.end();)
{
LogEntry *entry = it->second;
- if ((1 << entry->_logclass) & logclasses)
- {
- delete it->second;
- _entries.erase(it);
+ if ((1 << entry->_logclass) & logclasses) {
+ delete entry;
+ _entries.erase(it++);
freed ++;
+ } else {
+ ++it;
}
}
_logclasses_read &= ~logclasses;