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 ?
-------------------------------------------