Summary:ASTERISK-05226: [patch] Incorrect parsing of IF, SWITCH and WHILE operators argument.
Reporter:Sergey Okhapkin (sokhapkin)Labels:
Date Opened:2005-10-03 14:22:31Date Closed:2008-01-15 15:50:40.000-0600
Versions:Frequency of
Environment:Attachments:( 0) pbx_ael.c.cvs.diff
( 1) pbx_ael.c.diff
( 2) pbx_ael.c.diff-else
Description:To find the argument of these operators pbx_ael.c uses the following code:

if ((*args == '(') && (c = strchr(args, ')'))) {

The code sets "c" to incorrect "end of argument" location if the argument contains ")" character like in

if(${COLLERID(number)} = "1234567")

the "if" operator is translated (incorrectly) into:

    3. GotoIf($[ ${CALLERID(number ]?4:5)         [pbx_ael]
    4. Set(}=$[ 1234567)        noop(blah) ])            [pbx_ael]
    5. NoOp(Finish if-stdexten-3)                 [pbx_ael]

Comments:By: Sergey Okhapkin (sokhapkin) 2005-10-04 08:16:22

Attached trivial fix resolves the problem. The diff is against 1.2-beta1 release but applies clean to CVS HEAD also.

By: Sergey Okhapkin (sokhapkin) 2005-10-05 12:04:03

Added patch wich fixes parsing of operator "else" when "if" operator body contains braces like in

if(condition) {
} else

By: Sergey Okhapkin (sokhapkin) 2005-10-09 15:42:16

I made a new patch for pbx_ael.c. The patch is against CVS HEAD, includes all changes from previous 2 patches and adds CLI to pbx_ael module.

By: Russell Bryant (russell) 2005-10-11 19:03:42

Is there a reason to use argument_end() as opposed to just calling strrchr(), as opposed to strchr(), to find the last closing paren?

By: Sergey Okhapkin (sokhapkin) 2005-10-11 19:18:45

No, we can't use strrchr(), we have to check brackets nesting level. strrchr() will not find end of "if" in

if(asd()) a=qwe();


if(asd()) {

will not work - AEL removes all linefeeds before parsing, it parses from current character position till the end of context.

By: Russell Bryant (russell) 2005-10-11 19:43:05

ok, I probably should have just read the code instead of just asking.  :)

By: Mark Spencer (markster) 2005-10-12 16:58:41

Do you have a disclaimer on file so we can merge these changes?  Thanks!

By: Sergey Okhapkin (sokhapkin) 2005-10-12 17:04:43

markster: No, I didn't file a disclaimer. Where can I get the disclaimer form?

By: twisted (twisted) 2005-10-12 17:33:36

http://www.digium.com/index.php?menu=bugguidelines   almost at the bottom.  You have your choice of disclaimers.

By: Sergey Okhapkin (sokhapkin) 2005-10-13 07:56:07

Disclaimer sent.

By: Mark Spencer (markster) 2005-10-13 11:41:57

Fixed in CVS head, thanks for your contribution!

By: Digium Subversion (svnbot) 2008-01-15 15:50:40.000-0600

Repository: asterisk
Revision: 6756

U   trunk/pbx/pbx_ael.c

r6756 | markster | 2008-01-15 15:50:40 -0600 (Tue, 15 Jan 2008) | 2 lines

Fix ael if, while, else (bug ASTERISK-5226)