From: Stephen Morris Date: Wed, 24 Jul 2013 12:53:50 +0000 (+0100) Subject: [3050] Always clear "skip" flag before calling any callouts on a hook X-Git-Tag: bind10-1.2.0beta1-release~290^2 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=35f65cf6f3644e5bc97d058ceffe87b2253305be;p=thirdparty%2Fkea.git [3050] Always clear "skip" flag before calling any callouts on a hook --- diff --git a/src/lib/hooks/callout_manager.cc b/src/lib/hooks/callout_manager.cc index 5a2126a956..df27f45c4b 100644 --- a/src/lib/hooks/callout_manager.cc +++ b/src/lib/hooks/callout_manager.cc @@ -113,13 +113,15 @@ CalloutManager::calloutsPresent(int hook_index) const { void CalloutManager::callCallouts(int hook_index, CalloutHandle& callout_handle) { + // Clear the "skip" flag so we don't carry state from a previous call. + // This is done regardless of whether callouts are present to avoid passing + // any state from the previous call of callCallouts(). + callout_handle.setSkip(false); + // Only initialize and iterate if there are callouts present. This check // also catches the case of an invalid index. if (calloutsPresent(hook_index)) { - // Clear the "skip" flag so we don't carry state from a previous call. - callout_handle.setSkip(false); - // Set the current hook index. This is used should a callout wish to // determine to what hook it is attached. current_hook_ = hook_index; diff --git a/src/lib/hooks/tests/handles_unittest.cc b/src/lib/hooks/tests/handles_unittest.cc index e5364bcbe6..c19dff2773 100644 --- a/src/lib/hooks/tests/handles_unittest.cc +++ b/src/lib/hooks/tests/handles_unittest.cc @@ -841,6 +841,24 @@ TEST_F(HandlesTest, ReturnSkipClear) { EXPECT_FALSE(callout_handle.getSkip()); } +// Check that the skip flag is cleared when callouts are called - even if +// there are no callouts. + +TEST_F(HandlesTest, NoCalloutsSkipTest) { + // Note - no callouts are registered on any hook. + CalloutHandle callout_handle(getCalloutManager()); + + // Clear the skip flag and call a hook with no callouts. + callout_handle.setSkip(false); + getCalloutManager()->callCallouts(alpha_index_, callout_handle); + EXPECT_FALSE(callout_handle.getSkip()); + + // Set the skip flag and call a hook with no callouts. + callout_handle.setSkip(true); + getCalloutManager()->callCallouts(alpha_index_, callout_handle); + EXPECT_FALSE(callout_handle.getSkip()); +} + // The next set of callouts do a similar thing to the above "skip" tests, // but alter the value of a string argument. This is for testing that the // a callout is able to change an argument and return it to the caller.