From 0194e3a376aa9c1ec2c232b0f2fd9a6cf02e448d Mon Sep 17 00:00:00 2001 From: Michal 'vorner' Vaner Date: Mon, 25 Apr 2011 20:35:34 +0200 Subject: [PATCH] [trac847] Don't increment invalid iterator The problem was, it was increased after invalidating once before checking the condition again. It is probably harmless, but according to the letter not legal. --- src/bin/resolver/response_scrubber.cc | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/src/bin/resolver/response_scrubber.cc b/src/bin/resolver/response_scrubber.cc index 93bd8084a3..f2771b6370 100644 --- a/src/bin/resolver/response_scrubber.cc +++ b/src/bin/resolver/response_scrubber.cc @@ -1,4 +1,3 @@ - // Copyright (C) 2011 Internet Systems Consortium, Inc. ("ISC") // // Permission to use, copy, modify, and/or distribute this software for any @@ -50,7 +49,7 @@ ResponseScrubber::Category ResponseScrubber::addressCheck( unsigned int ResponseScrubber::scrubSection(Message& message, const vector& names, - const NameComparisonResult::NameRelation connection, + const NameComparisonResult::NameRelation connection, const Message::Section section) { unsigned int count = 0; // Count of RRsets removed @@ -74,22 +73,23 @@ ResponseScrubber::scrubSection(Message& message, // Start looking at the remaining entries in the section. removed = false; - for (; (i != message.endSection(section)) && (!removed); ++i) { + for (; i != message.endSection(section); ++i) { // Loop through the list of names given and see if any are in the // given relationship with the QNAME of this RRset bool nomatch = true; for (vector::const_iterator n = names.begin(); - ((n != names.end()) && nomatch); ++n) { + ((n != names.end())); ++n) { NameComparisonResult result = (*i)->getName().compare(**n); NameComparisonResult::NameRelation relationship = result.getRelation(); if ((relationship == NameComparisonResult::EQUAL) || (relationship == connection)) { - + // RRset in the specified relationship, so a match has // been found nomatch = false; + break; } } @@ -98,6 +98,7 @@ ResponseScrubber::scrubSection(Message& message, message.removeRRset(section, i); ++count; // One more RRset removed removed = true; // Something was removed + break; // It invalidated the iterators, start again } else { // There was a match so this is one more entry we can skip next