From: Alan T. DeKok Date: Thu, 25 Jun 2015 15:28:37 +0000 (-0400) Subject: Actually implement "break". X-Git-Tag: release_3_0_9~84 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=2eb560e7e93330932d368280809ace46b61e9080;p=thirdparty%2Ffreeradius-server.git Actually implement "break". And add unit tests --- diff --git a/src/main/modcall.c b/src/main/modcall.c index 2f77906a1ca..394e2a339b3 100644 --- a/src/main/modcall.c +++ b/src/main/modcall.c @@ -687,10 +687,12 @@ redo: } /* - * We've unwound to the enclosing - * "foreach". Stop the unwinding. + * We've been asked to unwind to the + * enclosing "foreach". We're here, so + * we can stop unwinding. */ - if (next->unwind == MOD_FOREACH) { + if (next->unwind == MOD_BREAK) { + entry->unwind = 0; break; } @@ -1075,7 +1077,6 @@ calculate_result: */ if (entry->unwind == MOD_BREAK) { RDEBUG2("# unwind to enclosing foreach"); - entry->unwind = 0; goto finish; } diff --git a/src/tests/keywords/foreach-break-2 b/src/tests/keywords/foreach-break-2 index baa54aa94aa..b1f60407a6a 100644 --- a/src/tests/keywords/foreach-break-2 +++ b/src/tests/keywords/foreach-break-2 @@ -38,6 +38,9 @@ foreach control:Tmp-String-0 { break } elsif ("%{Foreach-Variable-0}" == '9') { + update reply { + Filter-Id := "fail-9" + } reject } } diff --git a/src/tests/keywords/foreach-break-3 b/src/tests/keywords/foreach-break-3 new file mode 100644 index 00000000000..af03da63808 --- /dev/null +++ b/src/tests/keywords/foreach-break-3 @@ -0,0 +1,44 @@ +# +# PRE: foreach foreach-break +# + +update request { + Calling-Station-Id := "8" +} + +update control { + &Calling-Station-Id := "0" + &Calling-Station-Id += "1" + &Calling-Station-Id += "2" + &Calling-Station-Id += "3" + &Calling-Station-Id += "4" + &Calling-Station-Id += "5" + &Calling-Station-Id += "6" + &Calling-Station-Id += "7" + &Calling-Station-Id += "8" + &Calling-Station-Id += "9" + &Calling-Station-Id += "a" + &Calling-Station-Id += "b" + &Calling-Station-Id += "c" + &Calling-Station-Id += "d" + &Calling-Station-Id += "e" + &Calling-Station-Id += "f" + &Calling-Station-Id += "g" +} + +foreach &control:Calling-Station-Id { + if (&request:Calling-Station-Id == "%{Foreach-Variable-0}") { + update reply { + Filter-Id := "filter" + } + + break + } + elsif ("%{Foreach-Variable-0}" == '9') { + update reply { + Filter-Id := "fail-9" + } + + reject + } +}