Hello,
config file uses a special languaged, self made by the project. The
parameters of config files used to be string only for most of the
time, with fixup to convert to other types at startup -- some notes
here:
- http://www.asipto.com/pub/kamailio-devel-guide/#c16cmd_function
Later, after kamailio-ser integration started, there are some
options of giving parameters as integer, or even expressions in some
cases -- an extension to config language started by Andrei
Pelinescu-Onciul, which was not propagated to all functions, afaik.
So, in summary, yes, every parameter is expected as string unless
special fixup function is used. If you get a core dump, provide the
backtrace. Even the prameter is invalid, it should be detected and
printed as error message, then exit. Anyhow, have in mind that
config is not C or other generic purpose programming language.
Cheers,
Daniel
On 1/20/13 10:21 PM, Konstantin M.
wrote:
Hello,
While developing and testing my new application (app_java) I've
experienced a very wierd behaviour.
a simple line:
ismethod(free(malloc(0)));
in kamailio config file produces a segfault:
0(2227) ERROR: <core> [cfg.y:3455]: cfg. parser: failed to
find command malloc
0(2227) : <core> [cfg.y:3594]: parse error in config file
/opt/kamailio/etc/kamailio/kamailio.cfg, line 640, column 25:
unknown command, missing loadmodule?
Program received signal SIGSEGV, Segmentation fault.
0x081defde in yyparse () at cfg.y:3480
3480 if ($1 &&
mod_func_action->val[1].u.number < MAX_ACTIONS-2) {
(gdb)
so, let's pass a very wierd values :-) :
See following:
here is a small code snippet:
----------
exported functions definition (params from 2 to 7): { "java_exec",
(cmd_function)java_exec, 7, NULL, 0, ANY_ROUTE },
function prototype: int java_exec(struct sip_msg *msg, char
*method_name, char *signature, char *p1, char *p2, char *p3, char
*p4, char *p5);
----------
1)
java_exec("test",
"Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;", "str1",
"str2", "str3");
java_exec("test", "Ljava/lang/String;ILjava/lang/String;",
"str1", 5, "str3");
0(854) ERROR: app_java [java_iface.c:81]: java_exec():
method_name='test',
signature='Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;',
params: 'str1', 'str2', 'str3', '(null)', '(null)'
0(854) ERROR: app_java [java_iface.c:81]: java_exec():
method_name='test',
signature='Ljava/lang/String;ILjava/lang/String;', params: 'str1',
'5', 'str3', '(null)', '(null)'
2)
java_exec("test", "Ljava/lang/String;ILjava/lang/String;B",
"str1", 5, "str3", 77);
java_exec("test", "Ljava/lang/String;ILjava/lang/String;B",
"str1", 5, "str3", 0x77);
0(854) ERROR: app_java [java_iface.c:81]: java_exec():
method_name='test',
signature='Ljava/lang/String;ILjava/lang/String;B', params:
'str1', '5', 'str3', '77', '(null)'
0(877) ERROR: app_java [java_iface.c:81]: java_exec():
method_name='test',
signature='Ljava/lang/String;ILjava/lang/String;B', params:
'str1', '5', 'str3', '119', '(null)'
so, 77 is '77', 0x77 is '119' (hex conversion, ok)
3)
java_exec("test", "Ljava/lang/String;ILjava/lang/String;Z",
"str1", 5, "str3", true);
java_exec("test", "Ljava/lang/String;ILjava/lang/String;Z",
"str1", 5, "str3", false);
0(907) ERROR: app_java [java_iface.c:81]: java_exec():
method_name='test',
signature='Ljava/lang/String;ILjava/lang/String;Z', params:
'str1', '5', 'str3', '1', '(null)'
0(907) ERROR: app_java [java_iface.c:81]: java_exec():
method_name='test',
signature='Ljava/lang/String;ILjava/lang/String;Z', params:
'str1', '5', 'str3', '0', '(null)'
so, true is '1', false is '0'. What is it ?
4)
java_exec("test", "Ljava/lang/String;ILjava/lang/String;Z",
"str1", 5, "str3", TRUE);
java_exec("test", "Ljava/lang/String;ILjava/lang/String;Z",
"str1", 5, "str3", FALSE);
0(931) : <core> [cfg.y:3594]: parse error in config file
/opt/kamailio/etc/kamailio/kamailio.cfg, line 632, column 86:
syntax error
0(931) : <core> [cfg.y:3594]: parse error in config file
/opt/kamailio/etc/kamailio/kamailio.cfg, line 632, column 86:
'('')' expected (function call)
0(931) : <core> [cfg.y:3594]: parse error in config file
/opt/kamailio/etc/kamailio/kamailio.cfg, line 633, column 87:
syntax error
0(931) : <core> [cfg.y:3594]: parse error in config file
/opt/kamailio/etc/kamailio/kamailio.cfg, line 633, column 87:
'('')' expected (function call)
ERROR: bad config file (4 errors)
5)
java_exec("test", "Ljava/lang/String;ILjava/lang/String;Z",
"str1", 5, "str3", is_method("INVITE"));
Program received signal SIGSEGV, Segmentation fault.
fix_rval_expr (p=p@entry=0xb55dad00) at rvalue.c:3791
3791 return
fix_rval(&rve->left.rval);
(gdb)
6)
java_exec("test", "Ljava/lang/String;ILjava/lang/String;Z",
"str1", 5, "str3", is_unknown_method("INVITE"));
Program received signal SIGSEGV, Segmentation fault.
0x081defde in yyparse () at cfg.y:3480
3480 if ($1 &&
mod_func_action->val[1].u.number < MAX_ACTIONS-2) {
(gdb)
7)
java_exec("test", "Ljava/lang/String;ILjava/lang/String;Z",
"str1", 5, "str3", nonexistent_value);
0(1022) : <core> [cfg.y:3594]: parse error in config file
/opt/kamailio/etc/kamailio/kamailio.cfg, line 634, column 99:
syntax error
0(1022) : <core> [cfg.y:3594]: parse error in config file
/opt/kamailio/etc/kamailio/kamailio.cfg, line 634, column 99:
'('')' expected (function call)
ERROR: bad config file (2 errors)
8)
java_exec("test", "Ljava/lang/String;ILjava/lang/String;Z",
"str1", 5, "str3", nonexistent_function());
0(1035) : <core> [cfg.y:3594]: parse error in config file
/opt/kamailio/etc/kamailio/kamailio.cfg, line 634, column 99:
syntax error
0(1035) : <core> [cfg.y:3594]: parse error in config file
/opt/kamailio/etc/kamailio/kamailio.cfg, line 634, column 99:
'('')' expected (function call)
0(1035) ERROR: <core> [cfg.y:3455]: cfg. parser: failed to
find command nonexistent_function
0(1035) : <core> [cfg.y:3594]: parse error in config file
/opt/kamailio/etc/kamailio/kamailio.cfg, line 635, column 103:
unknown command, missing loadmodule?
Program received signal SIGSEGV, Segmentation fault.
0x081defde in yyparse () at cfg.y:3480
3480 if ($1 &&
mod_func_action->val[1].u.number < MAX_ACTIONS-2) {
(gdb)
9)
java_exec("test", "Ljava/lang/String;ILjava/lang/String;Z",
"str1", 5, "str3", 7777777777777777777777777777777777);
0(1368) ERROR: app_java [java_iface.c:81]: java_exec():
method_name='test',
signature='Ljava/lang/String;ILjava/lang/String;Z', params:
'str1', '5', 'str3', '2147483647', '(null)'
so, 7777777777777777777777777777777777 is '2147483647' (INT_MAX)
10)
java_exec("test", "Ljava/lang/String;ILjava/lang/String;Z",
"str1", 5, "str3", 0x5 << 1);
0(1392) ERROR: app_java [java_iface.c:81]: java_exec():
method_name='test',
signature='Ljava/lang/String;ILjava/lang/String;Z', params:
'str1', '5', 'str3', '10', '(null)'
----------------------------------
Creating a new function java_exec2 with int param:
exported function: { "java_exec2", (cmd_function)java_exec2,
2, NULL, 0, ANY_ROUTE },
prototype: int java_exec2(struct sip_msg *msg, char *method_name,
int param);
java_exec2("test", 5);
0(1690) ERROR: app_java [java_mod.c:56]: java_exec2():
method_name='test', params: '-1252293208'
changing prototype to: int java_exec2(struct sip_msg *msg, char
*method_name, void *param);
and trying to cast to (char*):
0(1867) ERROR: app_java [java_mod.c:56]: java_exec2():
method_name='test', params: '5'
so, the params are being forcibly cast to (char *) ? Why the
params aren't void pointers ?
-------------------------------------------
_______________________________________________
sr-dev mailing list
sr-dev@lists.sip-router.org
http://lists.sip-router.org/cgi-bin/mailman/listinfo/sr-dev
--
Daniel-Constantin Mierla - http://www.asipto.com
http://twitter.com/#!/miconda - http://www.linkedin.com/in/miconda
Kamailio World Conference, April 16-17, 2013, Berlin
- http://conference.kamailio.com -