Hello,<br><br>While developing and testing my new application (app_java) I've experienced a very wierd behaviour.<br><br>a simple line:<br> ismethod(free(malloc(0))); <br>in kamailio config file produces a segfault:<br>
0(2227) ERROR: <core> [cfg.y:3455]: cfg. parser: failed to find command malloc<br> 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?<br>
<br><br>Program received signal SIGSEGV, Segmentation fault.<br>0x081defde in yyparse () at cfg.y:3480<br>3480 if ($1 && mod_func_action->val[1].u.number < MAX_ACTIONS-2) {<br>(gdb)<br><br>
<br>so, let's pass a very wierd values :-) :<br>See following:<br>
<br><br>here is a small code snippet:<br>----------<br>exported functions definition (params from 2 to 7): { "java_exec", (cmd_function)java_exec, 7, NULL, 0, ANY_ROUTE },<br>function prototype: int java_exec(struct sip_msg *msg, char *method_name, char *signature, char *p1, char *p2, char *p3, char *p4, char *p5);<br>
----------<br><br>1)<br> java_exec("test", "Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;", "str1", "str2", "str3");<br> java_exec("test", "Ljava/lang/String;ILjava/lang/String;", "str1", 5, "str3");<br>
<br><br> 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)'<br>
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)'<br>
<br><br>2)<br> java_exec("test", "Ljava/lang/String;ILjava/lang/String;B", "str1", 5, "str3", 77);<br> java_exec("test", "Ljava/lang/String;ILjava/lang/String;B", "str1", 5, "str3", 0x77);<br>
<br> 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)'<br>
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)'<br>
<br> so, 77 is '77', 0x77 is '119' (hex conversion, ok)<br><br>3)<br> java_exec("test", "Ljava/lang/String;ILjava/lang/String;Z", "str1", 5, "str3", true);<br> java_exec("test", "Ljava/lang/String;ILjava/lang/String;Z", "str1", 5, "str3", false);<br>
<br> 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)'<br>
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)'<br>
<br> so, true is '1', false is '0'. What is it ?<br><br>4)<br> java_exec("test", "Ljava/lang/String;ILjava/lang/String;Z", "str1", 5, "str3", TRUE);<br> java_exec("test", "Ljava/lang/String;ILjava/lang/String;Z", "str1", 5, "str3", FALSE);<br>
<br> 0(931) : <core> [cfg.y:3594]: parse error in config file /opt/kamailio/etc/kamailio/kamailio.cfg, line 632, column 86: syntax error<br> 0(931) : <core> [cfg.y:3594]: parse error in config file /opt/kamailio/etc/kamailio/kamailio.cfg, line 632, column 86: '('')' expected (function call)<br>
0(931) : <core> [cfg.y:3594]: parse error in config file /opt/kamailio/etc/kamailio/kamailio.cfg, line 633, column 87: syntax error<br> 0(931) : <core> [cfg.y:3594]: parse error in config file /opt/kamailio/etc/kamailio/kamailio.cfg, line 633, column 87: '('')' expected (function call)<br>
ERROR: bad config file (4 errors)<br><br>5)<br> java_exec("test", "Ljava/lang/String;ILjava/lang/String;Z", "str1", 5, "str3", is_method("INVITE"));<br><br>Program received signal SIGSEGV, Segmentation fault.<br>
fix_rval_expr (p=p@entry=0xb55dad00) at rvalue.c:3791<br>3791 return fix_rval(&rve->left.rval);<br>(gdb)<br><br>6)<br> java_exec("test", "Ljava/lang/String;ILjava/lang/String;Z", "str1", 5, "str3", is_unknown_method("INVITE"));<br>
<br>Program received signal SIGSEGV, Segmentation fault.<br>0x081defde in yyparse () at cfg.y:3480<br>3480 if ($1 && mod_func_action->val[1].u.number < MAX_ACTIONS-2) {<br>(gdb)<br><br><br>
7)<br> java_exec("test", "Ljava/lang/String;ILjava/lang/String;Z", "str1", 5, "str3", nonexistent_value);<br><br> 0(1022) : <core> [cfg.y:3594]: parse error in config file /opt/kamailio/etc/kamailio/kamailio.cfg, line 634, column 99: syntax error<br>
0(1022) : <core> [cfg.y:3594]: parse error in config file /opt/kamailio/etc/kamailio/kamailio.cfg, line 634, column 99: '('')' expected (function call)<br>ERROR: bad config file (2 errors)<br><br>8)<br>
java_exec("test", "Ljava/lang/String;ILjava/lang/String;Z", "str1", 5, "str3", nonexistent_function());<br><br> 0(1035) : <core> [cfg.y:3594]: parse error in config file /opt/kamailio/etc/kamailio/kamailio.cfg, line 634, column 99: syntax error<br>
0(1035) : <core> [cfg.y:3594]: parse error in config file /opt/kamailio/etc/kamailio/kamailio.cfg, line 634, column 99: '('')' expected (function call)<br> 0(1035) ERROR: <core> [cfg.y:3455]: cfg. parser: failed to find command nonexistent_function<br>
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?<br><br><br>Program received signal SIGSEGV, Segmentation fault.<br>
0x081defde in yyparse () at cfg.y:3480<br>3480 if ($1 && mod_func_action->val[1].u.number < MAX_ACTIONS-2) {<br>(gdb)<br><br><br>9)<br> java_exec("test", "Ljava/lang/String;ILjava/lang/String;Z", "str1", 5, "str3", 7777777777777777777777777777777777);<br>
<br> 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)'<br>
<br> so, 7777777777777777777777777777777777 is '2147483647' (INT_MAX)<br><br>10)<br> java_exec("test", "Ljava/lang/String;ILjava/lang/String;Z", "str1", 5, "str3", 0x5 << 1);<br>
<br> 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)'<br>
<br>----------------------------------<br>Creating a new function java_exec2 with int param:<br>exported function: { "java_exec2", (cmd_function)java_exec2, 2, NULL, 0, ANY_ROUTE },<br>prototype: int java_exec2(struct sip_msg *msg, char *method_name, int param);<br>
<br> java_exec2("test", 5);<br><br> 0(1690) ERROR: app_java [java_mod.c:56]: java_exec2(): method_name='test', params: '-1252293208'<br><br> changing prototype to: int java_exec2(struct sip_msg *msg, char *method_name, void *param);<br>
and trying to cast to (char*):<br><br> 0(1867) ERROR: app_java [java_mod.c:56]: java_exec2(): method_name='test', params: '5'<br><br> so, the params are being forcibly cast to (char *) ? Why the params aren't void pointers ?<br>
<br>-------------------------------------------<br><br><br><br>