Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Negation operator in 'must' statement makes backend segmentation fault #179

Closed
pawelmaslanka opened this issue Feb 22, 2021 · 2 comments
Closed
Labels

Comments

@pawelmaslanka
Copy link

Setup

amod.yang

module amod {
  namespace "urn:amod";
  prefix a;

  container acont {
    leaf cond {
      type boolean;
      must "not(false = false)";
    }
  }
}

clixon.xml

<clixon-config xmlns="http://clicon.org/config">
  <CLICON_CONFIGFILE>/usr/local/etc/clixon.xml</CLICON_CONFIGFILE>
  <CLICON_FEATURE>*:*</CLICON_FEATURE>
  <CLICON_YANG_DIR>/usr/local/share/clixon</CLICON_YANG_DIR>
  <CLICON_YANG_DIR>/usr/local/share/yang</CLICON_YANG_DIR>
  <CLICON_YANG_MAIN_DIR>/usr/local/share/yang</CLICON_YANG_MAIN_DIR>
  <CLICON_CLI_MODE>ex</CLICON_CLI_MODE>
  <CLICON_CLI_DIR>/usr/local/lib/ex/cli</CLICON_CLI_DIR>
  <CLICON_CLISPEC_DIR>/usr/local/lib/ex/clispec</CLICON_CLISPEC_DIR>
  <CLICON_CLI_GENMODEL_COMPLETION>1</CLICON_CLI_GENMODEL_COMPLETION>
  <CLICON_CLI_GENMODEL_TYPE>VARS</CLICON_CLI_GENMODEL_TYPE>
  <CLICON_SOCK>/usr/local/var/ex.sock</CLICON_SOCK>
  <CLICON_BACKEND_PIDFILE>/usr/local/var/ex.pidfile</CLICON_BACKEND_PIDFILE>
  <CLICON_XMLDB_DIR>/usr/local/var/ex</CLICON_XMLDB_DIR>
  <CLICON_STARTUP_MODE>init</CLICON_STARTUP_MODE>
</clixon-config>

How to trigger an error?

Run clixon_cli and type the following commands:

set acont cond true
validate

After issue a 'validate' command, backend receive signal SIGSEGV.

Clixon backend backtrace

Program received signal SIGSEGV, Segmentation fault.
0x00007ffff7f89c15 in ctx_dup () from /usr/local/lib/libclixon.so.4
(gdb) thread apply all bt full

Thread 1 (process 46298):
#0  0x00007ffff7f89c15 in ctx_dup () from /usr/local/lib/libclixon.so.4
No symbol table info available.
#1  0x00007ffff7f8a81d in xp_eval () from /usr/local/lib/libclixon.so.4
No symbol table info available.
#2  0x00007ffff7f8a7ac in xp_eval () from /usr/local/lib/libclixon.so.4
No symbol table info available.
#3  0x00007ffff7f8a7ac in xp_eval () from /usr/local/lib/libclixon.so.4
No symbol table info available.
#4  0x00007ffff7f8a7ac in xp_eval () from /usr/local/lib/libclixon.so.4
No symbol table info available.
#5  0x00007ffff7f8a7ac in xp_eval () from /usr/local/lib/libclixon.so.4
No symbol table info available.
#6  0x00007ffff7f8a7ac in xp_eval () from /usr/local/lib/libclixon.so.4
No symbol table info available.
#7  0x00007ffff7f8a7ac in xp_eval () from /usr/local/lib/libclixon.so.4
No symbol table info available.
#8  0x00007ffff7f8a7ac in xp_eval () from /usr/local/lib/libclixon.so.4
No symbol table info available.
#9  0x00007ffff7f8a7ac in xp_eval () from /usr/local/lib/libclixon.so.4
No symbol table info available.
#10 0x00007ffff7f8a7ac in xp_eval () from /usr/local/lib/libclixon.so.4
No symbol table info available.
#11 0x00007ffff7f8cc4e in xp_function_not () from /usr/local/lib/libclixon.so.4
No symbol table info available.
#12 0x00007ffff7f8b56e in xp_eval () from /usr/local/lib/libclixon.so.4
No symbol table info available.
#13 0x00007ffff7f8a7ac in xp_eval () from /usr/local/lib/libclixon.so.4
No symbol table info available.
#14 0x00007ffff7f8a7ac in xp_eval () from /usr/local/lib/libclixon.so.4
No symbol table info available.
#15 0x00007ffff7f8a7ac in xp_eval () from /usr/local/lib/libclixon.so.4
No symbol table info available.
#16 0x00007ffff7f8a7ac in xp_eval () from /usr/local/lib/libclixon.so.4
No symbol table info available.
#17 0x00007ffff7f8a7ac in xp_eval () from /usr/local/lib/libclixon.so.4
No symbol table info available.
#18 0x00007ffff7f8a7ac in xp_eval () from /usr/local/lib/libclixon.so.4
No symbol table info available.
#19 0x00007ffff7f8a7ac in xp_eval () from /usr/local/lib/libclixon.so.4
No symbol table info available.
#20 0x00007ffff7f88e2e in xpath_vec_ctx () from /usr/local/lib/libclixon.so.4
No symbol table info available.
--Type <RET> for more, q to quit, c to continue without paging--
#21 0x00007ffff7f89933 in xpath_vec_bool () from /usr/local/lib/libclixon.so.4
No symbol table info available.
#22 0x00007ffff7f80a7b in xml_yang_validate_all () from /usr/local/lib/libclixon.so.4
No symbol table info available.
#23 0x00007ffff7f80807 in xml_yang_validate_all () from /usr/local/lib/libclixon.so.4
No symbol table info available.
#24 0x00007ffff7f814fe in xml_yang_validate_all_top () from /usr/local/lib/libclixon.so.4
No symbol table info available.
#25 0x0000555555560f10 in ?? ()
No symbol table info available.
#26 0x00005555555617f9 in ?? ()
No symbol table info available.
#27 0x0000555555561fe8 in ?? ()
No symbol table info available.
#28 0x00007ffff7f84f72 in rpc_callback_call () from /usr/local/lib/libclixon.so.4
No symbol table info available.
#29 0x0000555555560838 in ?? ()
No symbol table info available.
#30 0x00007ffff7f60c8b in clixon_event_loop () from /usr/local/lib/libclixon.so.4
No symbol table info available.
#31 0x000055555555c292 in ?? ()
No symbol table info available.
#32 0x00007ffff7d320b3 in __libc_start_main (main=0x55555555b1f0, argc=4, argv=0x7fffffffe5f8, init=<optimized out>, fini=<optimized out>, rtld_fini=<optimized out>, stack_end=0x7fffffffe5e8) at ../csu/libc-start.c:308
        self = <optimized out>
        result = <optimized out>
        unwind_buf = {cancel_jmp_buf = {{jmp_buf = {93824992294912, -2406180974767778618, 93824992266448, 140737488348656, 0, 0, 2406180975123485894, 2406163002662835398}, mask_was_saved = 0}}, priv = {pad = {0x0, 0x0, 0x4, 0x7fffffffe5f8}, data = {prev = 0x0, cleanup = 0x0, canceltype = 4}}}
        not_first_call = <optimized out>
#33 0x000055555555c8fe in ?? ()
No symbol table info available.

Note

This can be trigger by any other expression like this:

    leaf name {
      type string;
      must "not(contains(current(), 'foo')";
    }

Most important here is to put negation operator 'not'.

Thanks,
Pawel

olofhagsand added a commit that referenced this issue Feb 23, 2021
  * `false`, `true`
* Fixed: [Negation operator in 'must' statement makes backend segmentation fault](#179)
@olofhagsand
Copy link
Member

olofhagsand commented Feb 23, 2021

Fixed by patch above.
This is an area which has limited implementation, and as this issue showed, limited tests.
As part of the patch also added true() and false() so you can express things like: not(true())

Please verify

@pawelmaslanka
Copy link
Author

Successfully verified! This ticket can be closed now. Thank you @olofhagsand for provided fix.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Projects
None yet
Development

No branches or pull requests

2 participants