[OpenSIPS-Users] segmentation fault when calling pkg_malloc

Bogdan-Andrei Iancu bogdan at voice-system.ro
Thu Mar 12 10:42:47 CET 2009


Hi Chevio, Hi Kolev,

That is true what Kolev says - most probably you have a memory overwrite 
somewhere and you are messing up the data structure of the memory 
manager. It cannot be a race as the pkg memory is per process, so it is 
not shared.

To try to catch the bug, enable memory debugger - it will try to detect 
and report mem overflow, double free, etc...See:
http://www.opensips.org/pmwiki.php?n=Resources.DocsTsMem
"how to handle it" chapter

Regards,
Bogdan

Vasil Kolev wrote:
> В 14:10 -0700 на 11.03.2009 (ср), Chevio написа:
>   
>> Hi, All,
>>
>> I am getting a segmentation fault when calling pkg_malloc from a custom
>> module in opensips 1.4.4 notls,
>>
>> here is the offending code :
>>
>> int tncgw_ip_lookup(struct sip_msg* msg, char* _para1, char* _para2)
>> {
>>
>> 	str  _user_ip;
>> 	db_res_t* db_res = NULL;
>> 	char* strsql=NULL;
>> 	char* to_prefix=NULL;
>> 	char* new_uri=NULL;
>> 	char* new_to=NULL;
>> 	str strsqlstr;
>> 	str techprefix;
>> 	str to;
>> 	int retval=-1;
>> 	int dbg=1;
>>
>> 	if(dbg)LM_INFO("TNCGW ip_address_lookup 2009.03.11.a beta\n");
>>
>> 	techprefix.s=NULL;
>> 	_user_ip.s=NULL;
>>
>> 	if(dbg) LM_INFO("---Memory allocation\n");
>>
>> 	strsql=pkg_malloc(100);
>> 	new_to=pkg_malloc(MAX_URI_SIZE); ## this is the line 97
>> 	new_uri=pkg_malloc(MAX_URI_SIZE);
>> 	to_prefix=pkg_malloc(8);
>>
>>
>> and here is the  back trace
>>
>> Program terminated with signal 11, Segmentation fault.
>> [New process 32735]
>> #0  fm_malloc (qm=0x8183b00, size=<value optimized out>) at
>> mem/f_malloc.c:125
>> 125                             if (frag->size <= (*f)->size) break;
>> (gdb) bt
>> #0  fm_malloc (qm=0x8183b00, size=<value optimized out>) at
>> mem/f_malloc.c:125
>> #1  0xb7ab0873 in tncgw_ip_lookup (msg=0x8196ed8, _para1=0x0, _para2=0x0) at
>> tncgw.c:97
>> #2  0x08055275 in do_action (a=0x818d278, msg=0x8196ed8) at action.c:845
>> #3  0x08054172 in run_action_list (a=0x818d278, msg=0x8196ed8) at
>> action.c:138
>> #4  0x080a0516 in eval_expr (e=0x818d2e0, msg=0x8196ed8, val=0xbf8d4ef8) at
>> route.c:1133
>> #5  0x08053e2f in do_assign (msg=0x8196ed8, a=0x818d308) at action.c:207
>> #6  0x080549f5 in do_action (a=0x818d308, msg=0x8196ed8) at action.c:951
>> #7  0x08054172 in run_action_list (a=0x818d308, msg=0x8196ed8) at
>> action.c:138
>> #8  0x08056845 in do_action (a=0x818d8c0, msg=0x8196ed8) at action.c:717
>> #9  0x08054172 in run_action_list (a=0x8189fd0, msg=0x8196ed8) at
>> action.c:138
>> #10 0x080577f4 in run_top_route (a=0x8189fd0, msg=0x8196ed8) at action.c:118
>>
>> does it mean I ran out of memory? if that is the case pkg_malloc should
>> return a 0 instead of crashing.
>>     
>
>
> This doesn't seem like running out of memory, more like a memory
> corruption. The first thing to check is if either 'frag' or 'f' are NULL
> or invalid (e.g. in gdb do "print f", "print frag" and see what does
> that say). After that try dereferencing them, seeing how could they get
> these values, etc.
>
> If this isn't reproducible every time, it might also mean a race
> condition, that something else is fucking up the situation, in which
> case _probably_ valgrind can help (although I never had a lot of luck
> using it on opensips).
>
>   




More information about the Users mailing list